diff --git a/.devTools/routes.txt b/.devTools/routes.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1644dd9b2666ee38def62ebccdc2bfc23ba22b32
--- /dev/null
+++ b/.devTools/routes.txt
@@ -0,0 +1,57 @@
+
+  GET|HEAD  / ................................................................................................................................................................................................................................................................................................... home
+  POST      _ignition/execute-solution ................................................................................................................................................................................................. ignition.executeSolution › Spatie\LaravelIgnition › ExecuteSolutionController
+  GET|HEAD  _ignition/health-check ............................................................................................................................................................................................................. ignition.healthCheck › Spatie\LaravelIgnition › HealthCheckController
+  POST      _ignition/update-config .......................................................................................................................................................................................................... ignition.updateConfig › Spatie\LaravelIgnition › UpdateConfigController
+  GET|HEAD  api/dangers .................................................................................................................................................................................................................................................. api.dangers.all › Api\DangersController@all
+  GET|HEAD  api/evaluations ...................................................................................................................................................................................................................................... api.evaluations.all › Api\EvaluationsController@all
+  POST      api/evaluations .................................................................................................................................................................................................................................... api.evaluations.post › Api\EvaluationsController@save
+  PUT       api/evaluations/{id} ................................................................................................................................................................................................................................ api.evaluations.put › Api\EvaluationsController@save
+  GET|HEAD  api/evaluations/{id} ................................................................................................................................................................................................................................. api.evaluations.get › Api\EvaluationsController@get
+  DELETE    api/evaluations/{id} ........................................................................................................................................................................................................................... api.evaluations.delete › Api\EvaluationsController@delete
+  GET|HEAD  api/evaluations/{id}/graphs/attack ......................................................................................................................................................................................................... api.evaluations.graph.attack › Api\GraphDataController@attack
+  GET|HEAD  api/evaluations/{id}/graphs/best_measures ..................................................................................................................................................................................... api.evaluations.graph.best_measures › Api\GraphDataController@bestMeasures
+  GET|HEAD  api/evaluations/{id}/graphs/exposition ............................................................................................................................................................................................. api.evaluations.graph.exposition › Api\GraphDataController@exposition
+  GET|HEAD  api/evaluations/{id}/graphs/futurerisks .......................................................................................................................................................................................... api.evaluations.graph.futurerisks › Api\GraphDataController@futurerisks
+  GET|HEAD  api/evaluations/{id}/graphs/maturity ................................................................................................................................................................................................... api.evaluations.graph.maturity › Api\GraphDataController@maturity
+  GET|HEAD  api/evaluations/{id}/graphs/measures ................................................................................................................................................................................................... api.evaluations.graph.measures › Api\GraphDataController@measures
+  GET|HEAD  api/evaluations/{id}/graphs/risks ............................................................................................................................................................................................................ api.evaluations.graph.risks › Api\GraphDataController@risks
+  POST      api/forgetpwd .............................................................................................................................................................................................................................................. api.forgetpwd › Api\UsersController@forgetpwd
+  GET|HEAD  api/graphs/actionterritory ............................................................................................................................................................................................... api.evaluations.graph.actionterritory › Api\GraphDataController@actionterritory
+  GET|HEAD  api/graphs/organizations/{territory_id?} ..................................................................................................................................................................................... api.evaluations.graph.organizations › Api\GraphDataController@organizations
+  POST      api/impersonate ....................................................................................................................................................................................................................................... api.impersonate › Auth\LoginController@impersonate
+  POST      api/leave ............................................................................................................................................................................................................................... api.leaveImpersonation › Auth\LoginController@leaveImpersonation
+  GET|HEAD  api/measures ............................................................................................................................................................................................................................................... api.measures.all › Api\MeasuresController@all
+  GET|HEAD  api/measures/download ...................................................................................................................................................................................................................... api.measures.downloadAll › Api\MeasuresController@downloadAll
+  GET|HEAD  api/measures/download/{id} ....................................................................................................................................................................................................................... api.measures.download › Api\MeasuresController@download
+  PUT       api/measures/{id} ......................................................................................................................................................................................................................................... api.measures.put › Api\MeasuresController@save
+  GET|HEAD  api/organizations ................................................................................................................................................................................................................................ api.organizations.all › Api\OrganizationsController@all
+  POST      api/organizations .............................................................................................................................................................................................................................. api.organizations.post › Api\OrganizationsController@save
+  PUT       api/organizations/{id} .......................................................................................................................................................................................................................... api.organizations.put › Api\OrganizationsController@save
+  DELETE    api/organizations/{id} ..................................................................................................................................................................................................................... api.organizations.delete › Api\OrganizationsController@delete
+  GET|HEAD  api/questions .............................................................................................................................................................................................................................................. api.maturity.all › Api\MaturityController@all
+  GET|HEAD  api/scenarios ............................................................................................................................................................................................................................................ api.scenarios.all › Api\ScenariosController@all
+  GET|HEAD  api/territories ...................................................................................................................................................................................................................................... api.territories.all › Api\TerritoriesController@all
+  POST      api/territories .................................................................................................................................................................................................................................... api.territories.post › Api\TerritoriesController@save
+  PUT       api/territories/{id} ................................................................................................................................................................................................................................ api.territories.put › Api\TerritoriesController@save
+  DELETE    api/territories/{id} ........................................................................................................................................................................................................................... api.territories.delete › Api\TerritoriesController@delete
+  GET|HEAD  api/users ........................................................................................................................................................................................................................................................ api.users.all › Api\UsersController@all
+  POST      api/users ...................................................................................................................................................................................................................................................... api.users.post › Api\UsersController@save
+  GET|HEAD  api/users/me ....................................................................................................................................................................................................................................................... api.users.me › Api\UsersController@me
+  PUT       api/users/{id} .................................................................................................................................................................................................................................................. api.users.put › Api\UsersController@save
+  DELETE    api/users/{id} ............................................................................................................................................................................................................................................. api.users.delete › Api\UsersController@delete
+  GET|HEAD  export/evaluations.{ext} ............................................................................................................................................................................................................................... export.evaluations › ExportController@evaluations
+  GET|HEAD  export/structures.{ext} ............................................................................................................................................................................................................................ export.organizations › ExportController@organizations
+  POST      login ................................................................................................................................................................................................................................................................. login › Auth\LoginController@login
+  GET|HEAD  login .................................................................................................................................................................................................................................................................................................... 
+  GET|HEAD  logout ............................................................................................................................................................................................................................................................. logout › Auth\LogoutController@logout
+  POST      newpassword .......................................................................................................................................................................................................................................... password_reset.send › UsersController@storePassword
+  GET|HEAD  newpassword/{id}/{reset_token} ........................................................................................................................................................................................................................... password_reset › UsersController@createPassword
+  GET|HEAD  pdf/dossierCyberSecurite/{organization_id}/{evaluation_id?} ........................................................................................................................................................................... pdf.dossier_cyber_securite › PdfController@DossierCyberSecuritePdf
+  GET|HEAD  pdf/planAction/{organization_id} ........................................................................................................................................................................................................................... pdf.plan_action › PdfController@ActionPlanPdf
+  GET|HEAD  pdf/politiqueSecurite/{organization_id} ...................................................................................................................................................................................................... pdf.politique_securite › PdfController@PolitiqueSecuritePdf
+  GET|HEAD  sanctum/csrf-cookie .......................................................................................................................................................................................................................................... Laravel\Sanctum › CsrfCookieController@show
+  GET|HEAD  {any} .................................................................................................................................................................................................................................................................................................... 
+
+                                                                                                                                                                                                                                                                                                   Showing [53] routes
+
diff --git a/.devTools/scripts/dump-routes.sh b/.devTools/scripts/dump-routes.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a8f48678363b5eac6f8439c8c72e5ecd6d826eba
--- /dev/null
+++ b/.devTools/scripts/dump-routes.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd ../..
+./artisan route:list --no-ansi > ./.devTools/routes.txt
diff --git a/.devTools/scripts/ide-helper.sh b/.devTools/scripts/ide-helper.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3d1a10a7fe488942719ef68bc3b815d681ee3a9d
--- /dev/null
+++ b/.devTools/scripts/ide-helper.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+cd ../..
+./vendor/bin/sail artisan ide-helper:generate
+./vendor/bin/sail artisan ide-helper:meta
+./vendor/bin/sail artisan ide-helper:models -W
+./vendor/bin/php-cs-fixer fix ./app/Models
diff --git a/.env.docker b/.env.docker
new file mode 100644
index 0000000000000000000000000000000000000000..5a15b154e0e08b3111cc55915053303885681029
--- /dev/null
+++ b/.env.docker
@@ -0,0 +1,64 @@
+APP_NAME="Madis Cyber"
+APP_ENV=local
+APP_KEY=base64:wJlBLhzTz0XSp8HoFwb/4z4QsG7Ad8H++FjURNhSxtU=
+APP_DEBUG=true
+APP_URL=http://madis-cyber.test
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=mysql
+DB_PORT=3306
+DB_DATABASE=laravel
+DB_USERNAME=sail
+DB_PASSWORD=password
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=redis
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_MAILER=smtp
+MAIL_HOST=mailhog
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+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_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1,127.0.0.1:8000,::1,madis.test,cyber.local,madis-cyber.test
+
+ADMIN_EMAIL=admin@datakode.fr
+ADMIN_FIRSTNAME=Admin
+ADMIN_LASTNAME=Datakode
+ADMIN_PASSWORD=secret
+
+APP_FAVICON_PATH="logo_madis_2020_favicon_white.png"
+REFERENTIEL_VERSION="1.3"
+SEUIL_ALERTE=1
+LOGO_SIDEBAR="logo-soluris.png"
+FOOTER_LINK=https://www.soluris.fr/
diff --git a/.env.example b/.env.example
index 898e575a2bd8160b2f80a9c099ebbb4f77b9bc5f..2f8f52ea75e466b1dca1b26b4c278202ff5743c1 100644
--- a/.env.example
+++ b/.env.example
@@ -60,5 +60,6 @@ ADMIN_PASSWORD=secret
 
 APP_FAVICON_PATH="logo_madis_2020_favicon_white.png"
 REFERENTIEL_VERSION="1.3"
+SEUIL_ALERTE=1
 LOGO_SIDEBAR="logo-soluris.png"
 FOOTER_LINK=https://www.soluris.fr/
diff --git a/.env.test b/.env.test
index 6115beb11437b56852e59bc8134dc3705df5a24f..7ede78b89c5dc60598658785bb667b5d07300839 100644
--- a/.env.test
+++ b/.env.test
@@ -54,5 +54,6 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
 SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1,127.0.0.1:8000,::1
 APP_FAVICON_PATH="logo_madis_2020_favicon_white.png"
 REFERENTIEL_VERSION="1.3"
+SEUIL_ALERTE=1
 LOGO_SIDEBAR="logo-soluris.png"
 FOOTER_LINK=https://www.soluris.fr/
diff --git a/.gitignore b/.gitignore
index c0a35d4be0442d4f1705a0fd2a981bca1f60b0da..4a934b40cfa098c76af0ebc658b2622685d7354a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,5 @@ public/images
 /Vagrantfile
 /after.sh
 /aliases
+/.phpstorm.meta.php
+/_ide_helper.php
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e21e789351ff3913676b37d6d4a4747593b2b46e..cb0ced8d4aff2cbd4417fb6b2092ee15e37557dd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -30,8 +30,6 @@ sast:
     - php composer-setup.php
     - php -r "unlink('composer-setup.php');"
     - php composer.phar install -vv --prefer-dist --no-interaction --optimize-autoloader --no-scripts || echo "Composer install fail"
-    - curl -L https://github.com/fabpot/local-php-security-checker/releases/download/v2.0.3/local-php-security-checker_2.0.3_linux_amd64 --output /bin/php-security-checker
-    - chmod 755 /bin/php-security-checker
 
 .cache-pull-template: &cache-pull-definition
   cache:
@@ -58,7 +56,7 @@ unit_tests:
   <<: *vendor-install-definition
   <<: *cache-pull-definition
   script:
-    - php -dxdebug.mode=coverage vendor/bin/phpunit --coverage-text --colors=never --coverage-html storage/artefacts/coverage/
+    - php -dxdebug.mode=coverage vendor/bin/phpunit --colors=never
   coverage: /^\s+Lines:\s+(\d+)\.\d+%/
   artifacts:
     paths:
@@ -82,6 +80,8 @@ check-security:
   <<: *vendor-install-definition
   <<: *cache-pull-definition
   script:
+    - curl -L https://github.com/fabpot/local-php-security-checker/releases/download/v2.0.3/local-php-security-checker_2.0.3_linux_amd64 --output /bin/php-security-checker
+    - chmod 755 /bin/php-security-checker
     - /bin/php-security-checker
   stage: quality-assurance
   except:
@@ -98,7 +98,7 @@ phpstan:
     - master
 
 eslint:
-  image: node:14
+  image: node:16
   script:
     - npm install && npm run lint
   stage: quality-assurance
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000000000000000000000000000000000000..be3f7b28e564e7dd05eaf59d64adba1a4065ac0e
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,661 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<https://www.gnu.org/licenses/>.
diff --git a/README.md b/README.md
index b25c73460e9245451a829f92c88df9d6842dda28..88c1f522543588b1b72a2ff51369ec1c80869d7a 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,12 @@ # Madis Cyber
 
 ## Installation sur serveur linux
 
-Installer PHP 8, nginx, git, ghostscript, wkhtmltopdf et mysql comme recommandé pour votre variante de linux
+Installe PHP 8, nginx, git, ghostscript et mysql comme recommandé pour votre variante de linux
+
+Installer wkhtmltopdf en suivant cette procédure : 
+
+- Récupérer la version 0.12.6-1 depuis [https://github.com/wkhtmltopdf/packaging/releases/tag/0.12.6-1]() pour votre système d'exploitation
+- Installer avec `sudo apt install ./wkhtmltox_0.12.6-1.<OS_VERSION>.deb` (Remplacez `<OS_VERSION>` par la version de votre système d'exploitation utilisé à l'étape 1 )
 
 Installer les extensions PHP suivantes (à l'aide d'une commande du type `apt-get install php8.1-zip`) :
 
@@ -50,6 +55,11 @@ ## Installation sur serveur linux
 - `ADMIN_LASTNAME` : cela sera le nom de l'utilisateur administrateur que nous allons créer par la suite
 - `APP_FAVICON_PATH` : (_optionnel_) le chemin vers l'image à utiliser comme icone d'onglet (image à placer dans le dossier public/images)
 - `REFERENTIEL_VERSION` : La version du référentiel à utiliser pour les évaluations
+- `SEUIL_ALERTE` : permet la comparaison du niveau des measures fondamentales avec le seuil d'alerte. Sa valeur peut aller de -1 (ne pas prendre en compte) à 3.
+
+- `MIX_FOOTER_NAME`: nom du pied de page en bas à gauche
+- `MIX_FOOTER_LINK`: lien du nom de pied de page en bas à gauche
+- `MIX_FOOTER_YEAR`: année du copyright en bas à gauche
 
 Installez les dépendances php avec composer en lançant la commande suivante :
 `composer install --optimize-autoloader --no-dev`
@@ -59,9 +69,9 @@ ## Installation sur serveur linux
 
 Ensuite, lancez les migrations avec `php artisan migrate`
 
-_Optionnel_ : Pour remplir la base de données avec des données factices, vous pouvez lancer la commande `php artisan db:seed`
+Lancez la commande `php artisan storage:link` pour faire en sorte que les documents envoyés soient téléchargeables
 
-Ensuite nous pouvons créer un premier administrateur en lancant la commande `php artisan db:seed --class=UserSeeder` (vous pouvez omettre cette étape si vous avez choisi de remplir la base de données avec des données factices)
+Nous pouvons installer les données et créer un premier utilisateur en lançant la commande `php artisan db:seed --class=InstanceSeeder`
 
 Installer nodejs en version >= 14.
 
diff --git a/app/Calculator/MaturityAnswerLevelCalculator.php b/app/Calculator/MaturityAnswerLevelCalculator.php
index e1cab2a252d7f0ad7a97152b29ddf2619a923a83..6cb28cf047670fac353d4d0e3f3fdd08c21d28e8 100644
--- a/app/Calculator/MaturityAnswerLevelCalculator.php
+++ b/app/Calculator/MaturityAnswerLevelCalculator.php
@@ -7,7 +7,7 @@
 
 class MaturityAnswerLevelCalculator
 {
-    public function calculateFundamentalLevel(Evaluation $evaluation): int
+    public static function calculateFundamentalLevel(Evaluation $evaluation): int
     {
         $fundamentalMeasures = $evaluation->measureLevels->filter(function (MeasureLevel $ml) {
             return true === $ml->measure->fundamental;
@@ -20,7 +20,7 @@ public function calculateFundamentalLevel(Evaluation $evaluation): int
         return (int) floor($level);
     }
 
-    public function calculateExecutionLevel(Evaluation $evaluation, Evaluation|null $previousEvaluation): int
+    public static function calculateExecutionLevel(Evaluation $evaluation, Evaluation|null $previousEvaluation): int
     {
         if ($previousEvaluation) {
             // Count the number of measures that had an expected_level
diff --git a/app/Enums/MaturityQuestionNames.php b/app/Enums/MaturityQuestionNames.php
new file mode 100644
index 0000000000000000000000000000000000000000..92dade889266c18d8b64c5deedf384884c473bef
--- /dev/null
+++ b/app/Enums/MaturityQuestionNames.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Enums;
+
+enum MaturityQuestionNames: string
+{
+    case KNOWLEDGE = 'Connaissance';
+    case ORGANIZATION = 'Organisation';
+    case MOTIVATION = 'Motivation';
+    case EXECUTION = 'Exécution';
+    case FUNDAMENTALS = 'Fondamentaux';
+}
diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php
index 673842a5a8f49a27861c25638f5c33de34614d4c..3314793338142afc9d50ab28ff2c1a24a36e2d1c 100644
--- a/app/Exceptions/Handler.php
+++ b/app/Exceptions/Handler.php
@@ -3,7 +3,6 @@
 namespace App\Exceptions;
 
 use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
-use Throwable;
 
 class Handler extends ExceptionHandler
 {
@@ -41,7 +40,7 @@ class Handler extends ExceptionHandler
      */
     public function register()
     {
-        $this->reportable(function (Throwable $e) {
+        $this->reportable(function (\Throwable $e) {
         });
     }
 }
diff --git a/app/Exceptions/MissingMaturityAnswerException.php b/app/Exceptions/MissingMaturityAnswerException.php
index fa69795124e51acdca5a7ddbe873a955e427e46d..be5ffa5297ff4dcea5864a03b2b75bc9d79dea03 100644
--- a/app/Exceptions/MissingMaturityAnswerException.php
+++ b/app/Exceptions/MissingMaturityAnswerException.php
@@ -2,8 +2,6 @@
 
 namespace App\Exceptions;
 
-use Exception;
-
-class MissingMaturityAnswerException extends Exception
+class MissingMaturityAnswerException extends \Exception
 {
 }
diff --git a/app/Http/Controllers/Api/EvaluationsController.php b/app/Http/Controllers/Api/EvaluationsController.php
index 0abd7f83054f661ddf048ac47e75e8e23d58cece..6ba54be62c5a1e63865644e251f185d8f1a88ed2 100644
--- a/app/Http/Controllers/Api/EvaluationsController.php
+++ b/app/Http/Controllers/Api/EvaluationsController.php
@@ -65,8 +65,6 @@ public function get(int $id)
     /**
      * Enregistre l'évaluation en tant que terminée (validation sur l'étape en cours).
      *
-     * @param $id
-     *
      * @return Evaluation|null
      */
     public function save(EvaluationRepository $repository, EvaluationRequest $request, $id = null)
diff --git a/app/Http/Controllers/Api/GraphDataController.php b/app/Http/Controllers/Api/GraphDataController.php
index b2a856be138141cedd21920da5d10e429c2f7bef..9cf4edd305a280094070cab5fc3202fb2f3055d0 100644
--- a/app/Http/Controllers/Api/GraphDataController.php
+++ b/app/Http/Controllers/Api/GraphDataController.php
@@ -35,6 +35,16 @@ public function measures(int $id): Collection|array|\Illuminate\Support\Collecti
         return $this->repository->getMeasuresDataForEvaluation($evaluation);
     }
 
+    /**
+     * @param int $id Evaluation id
+     */
+    public function bestMeasures(int $id): Collection|array|\Illuminate\Support\Collection
+    {
+        $evaluation = $this->getEvaluation($id);
+
+        return $this->repository->getBestMeasuresForEvaluation($evaluation);
+    }
+
     /**
      * @param int $id Evaluation id
      */
@@ -86,8 +96,21 @@ public function attack(int $id): Collection|array|\Illuminate\Support\Collection
     }
 
     /**
-     * @param $id
+     * Get ActionTerritory graph data.
      */
+    public function actionterritory(): Collection|array|\Illuminate\Support\Collection
+    {
+        return $this->repository->getActionTerritoryGraphData();
+    }
+
+    /**
+     * Get organizations data.
+     */
+    public function organizations($territory_id = null): Collection|array|\Illuminate\Support\Collection
+    {
+        return $this->repository->getOrganizationData($territory_id);
+    }
+
     private function getEvaluation($id): Evaluation
     {
         /**
diff --git a/app/Http/Controllers/Api/MeasuresController.php b/app/Http/Controllers/Api/MeasuresController.php
index d34e9b023996f79b82b0f0015f401d6c2675ef0e..2a4cfcd92587a56e093f636a9c2f03d337771a0b 100644
--- a/app/Http/Controllers/Api/MeasuresController.php
+++ b/app/Http/Controllers/Api/MeasuresController.php
@@ -67,7 +67,7 @@ private function saveLevel(Measure $measure, $data, $level)
         if ($data['levels'] && is_array($data['levels']) && count($data['levels']) > $level) {
             $measure->{'level' . $niveau . '_actual_label'} = $data['levels'][$level]['actual_label'];
             $measure->{'level' . $niveau . '_preconized_label'} = $data['levels'][$level]['preconized_label'];
-            $measure->{'level' . $niveau . '_description'} = $data['levels'][$level]['description'] ?? null;
+//            $measure->{'level' . $niveau . '_description'} = $data['levels'][$level]['description'] ?? null;
             $measure->{'level' . $niveau . '_difficulty'} = $data['levels'][$level]['difficulty'];
             $measure->{'level' . $niveau . '_cost'} = $data['levels'][$level]['cost'];
             $measure->{'level' . $niveau . '_duration'} = $data['levels'][$level]['duration'];
diff --git a/app/Http/Controllers/Api/OrganizationsController.php b/app/Http/Controllers/Api/OrganizationsController.php
index a1f58fc8db7359ed9804c211628f5a84dc27749f..03ff5b7216a19f14749a49a23980638cd23d90f3 100644
--- a/app/Http/Controllers/Api/OrganizationsController.php
+++ b/app/Http/Controllers/Api/OrganizationsController.php
@@ -83,6 +83,8 @@ public function save(OrganizationRequest $request, $id = null)
             $address->cp = $data['address']['cp'];
             $address->city = $data['address']['city'];
             $address->codeInsee = $data['address']['codeInsee'];
+            $address->lat = $data['address']['lat'] ?? null;
+            $address->lng = $data['address']['lng'] ?? null;
             $address->save();
 
             $organization->referent_id = $this->UpdateReferent($referent, $data['referent']);
diff --git a/app/Http/Controllers/Auth/LogoutController.php b/app/Http/Controllers/Auth/LogoutController.php
index d2f6210a78f818decbfb13b6c8eba41238373263..b8aa70b46238872f3ba12fa0a4f432e90df8adeb 100755
--- a/app/Http/Controllers/Auth/LogoutController.php
+++ b/app/Http/Controllers/Auth/LogoutController.php
@@ -24,6 +24,6 @@ public function logout()
             Auth::guard('web')->logout();
         }
 
-        return redirect('/');
+        return redirect(route('login'));
     }
 }
diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php
new file mode 100644
index 0000000000000000000000000000000000000000..c914e8f2e82854036f91f359aa0e1ad8dbc34a4a
--- /dev/null
+++ b/app/Http/Controllers/ExportController.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Resources\EvaluationExportResource;
+use App\Http\Resources\OrganizationExportResource;
+use App\Models\Evaluation;
+use App\Models\Organization;
+use Illuminate\Http\Request;
+use Illuminate\Support\Collection;
+use Spatie\SimpleExcel\SimpleExcelWriter;
+
+class ExportController extends Controller
+{
+    public function organizations(Request $request): Collection|null
+    {
+        $ext = $request->route('ext');
+        $filename = "structures.$ext";
+        $data = Organization::with(['address', 'referent', 'referentCyber', 'referentElu', 'territory', 'evaluations', 'evaluations.dangerLevels'])->get();
+        $rows = OrganizationExportResource::collection($data)->toArray($request);
+        $header = $this->_getRowsHeader($rows[0], 'exports.organization');
+
+        if ('json' === $ext) {
+            //            die('<pre>'.print_r($rows).'</pre>');
+            return collect(compact('header', 'rows'));
+        }
+
+        $rows = [$header, ...$rows];
+
+        SimpleExcelWriter::streamDownload($filename)
+            ->noHeaderRow()
+            ->addRows($rows)
+            ->toBrowser();
+
+        return null;
+    }
+
+    public function evaluations(Request $request): Collection|null
+    {
+        $ext = $request->route('ext');
+        $filename = "evaluations.$ext";
+        $data = Evaluation::with(['dangerLevels'])->get();
+        $rows = EvaluationExportResource::collection($data)->toArray($request);
+        $header = $this->_getRowsHeader($rows[0], 'exports.evaluation');
+
+        if ('json' === $ext) {
+            return collect(compact('header', 'rows'));
+        }
+
+        $rows = [$header, ...$rows];
+
+        SimpleExcelWriter::streamDownload($filename)
+            ->noHeaderRow()
+            ->addRows($rows)
+            ->toBrowser();
+
+        return null;
+    }
+
+    private function _getRowsHeader(array $cols, string $prefix): array
+    {
+        $keys = collect($cols)->keys();
+
+        return $keys->map(function ($item) use ($prefix) {
+            return trans($prefix . '.' . $item);
+        })->toArray();
+    }
+}
diff --git a/app/Http/Controllers/PdfController.php b/app/Http/Controllers/PdfController.php
index c694986cc0bcd936030af200ac18daf4c508d802..ba5d448f11fd3a8fb71c8ec5556137f4a2982445 100644
--- a/app/Http/Controllers/PdfController.php
+++ b/app/Http/Controllers/PdfController.php
@@ -4,6 +4,7 @@
 
 use App\Models\DangerLevel;
 use App\Models\Evaluation;
+use App\Models\Measure;
 use App\Models\MeasureLevel;
 use App\Models\Organization;
 use App\Models\User;
@@ -11,6 +12,7 @@
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
 
 class PdfController extends Controller
 {
@@ -34,23 +36,12 @@ public function ActionPlanPdf()
             ->orderBy('updated_at', 'DESC')
             ->first();
 
-        if (!$evaluation) {
-            abort(404);
-        }
-
-        $collectionAction = collect($evaluation->measureLevels)->filter(function (MeasureLevel $ml) {
-            return null !== $ml->expected_level && $ml->actual_level < 3 && $ml->actual_level !== $ml->expected_level;
-        });
-        $actionSorted = $collectionAction->sortBy('end_date');
-        $actionSorted = $actionSorted->values()->all();
+        $actionSorted = $this->getActionSorted($evaluation);
 
         $data = [
-            'plan_name' => 'Test plan',
             'organization' => $organization,
             'evaluation' => $evaluation,
             'actions' => $actionSorted,
-            'elu' => 'test elu',
-            'agent' => 'test agent',
             'referentiel' => $evaluation->reference,
             'date' => $organization->updated_at->format('d/m/Y'),
         ];
@@ -78,20 +69,26 @@ public function ActionPlanPdf()
             unlink(storage_path('app/action_plan/tmp.pdf'));
         }
 
-        $pdf->save(storage_path('app/action_plan/tmp.pdf'));
+        // foreach measure, get all levels that should be added
+        $measureDocs = collect($actionSorted)->map(function (MeasureLevel $ml) {
+            $files = [];
+            for ($i = $ml->actual_level + 1; $i <= $ml->expected_level; ++$i) {
+                if (null !== $ml->measure->{'level' . $i . '_file'}) {
+                    $files[] = str_replace('/storage/', storage_path('app/public/'), $ml->measure->{'level' . $i . '_file'});
+                }
+            }
 
-        // Add measure documents to end of PDF file
-        $measureDocs = collect($actionSorted)->filter(function (MeasureLevel $ml) {
-            return null !== $ml->measure->{'level' . $ml->expected_level . '_file'};
-        })->map(function (MeasureLevel $ml) {
-            $url = $ml->measure->{'level' . $ml->expected_level . '_file'};
+            return $files;
+        })->flatten()->join('" "');
 
-            return str_replace('/storage/', storage_path('app/public/'), $url);
-        })->join('" "');
+        $pdf->save(storage_path('app/action_plan/tmp.pdf'));
 
+        // Add measure documents to end of PDF file
         if (strlen($measureDocs) > 0) {
             $measurePdfs = '"' . $measureDocs . '"';
-            $command = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="' . storage_path('app/action_plan/' . $filename) . '" "' . storage_path('app/action_plan/tmp.pdf') . '" ' . $measurePdfs;
+            $command = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="'
+                . storage_path('app/action_plan/' . $filename)
+                . '" "' . storage_path('app/action_plan/tmp.pdf') . '" ' . $measurePdfs;
             exec($command);
         } else {
             Storage::disk('local')->move('action_plan/tmp.pdf', 'action_plan/' . $filename);
@@ -107,7 +104,7 @@ public function PolitiqueSecuritePdf()
         $authUser = Auth::user();
         $isAdmin = $authUser && (User::ROLE_ADMIN === $authUser->role);
 
-        $organization = Organization::where('id', $organization_id)
+        $organization = Organization::with('referent')->where('id', $organization_id)
             ->first();
 
         $evaluation = Evaluation::where('organization_id', $organization_id)
@@ -125,11 +122,8 @@ public function PolitiqueSecuritePdf()
         }
 
         $data = [
-            'plan_name' => 'Test plan',
             'organization' => $organization,
             'evaluation' => $evaluation,
-            'elu' => 'test elu',
-            'agent' => 'test agent',
             'referentiel' => $evaluation->reference,
             'date' => $organization->updated_at->format('d/m/Y'),
         ];
@@ -158,50 +152,57 @@ public function PolitiqueSecuritePdf()
         return Storage::download('politique_securite/' . $filename, 'Politique de sécurité - ' . date('Y-m-d') . '.pdf');
     }
 
-    public function DossierCyberSecuritePdf(GraphDataRepository $repository)
+    public function DossierCyberSecuritePdf(GraphDataRepository $repository, $organization_id, $evaluation_id = null)
     {
-        $organization_id = request()->route()->parameters['organization_id'];
-
         $authUser = Auth::user();
         $isAdmin = $authUser && (User::ROLE_ADMIN === $authUser->role);
 
-        $organization = Organization::where('id', $organization_id)
-            ->first();
-
-        $evaluation = Evaluation::where('organization_id', $organization_id)
-            ->where('status', Evaluation::STATUS_DONE)
-            ->where('reference', env('REFERENTIEL_VERSION'))
-            ->with('dangerLevels')
-            ->with('measureLevels')
-            ->with('measureLevels.measure')
-            ->with('organization')
-            ->orderBy('updated_at', 'DESC')
+        $organization = Organization::with('referent')->where('id', $organization_id)
             ->first();
 
-        if (!$evaluation) {
-            abort(404);
+        if ($evaluation_id) {
+            $evaluation = Evaluation::where('organization_id', $organization_id)
+                ->where('id', $evaluation_id)
+//                ->where('status', Evaluation::STATUS_DONE)
+                ->with('dangerLevels')
+                ->with('measureLevels')
+                ->with('measureLevels.measure')
+                ->with('organization')
+                ->first();
+        } else {
+            $evaluation = Evaluation::where('organization_id', $organization_id)
+                ->where('status', Evaluation::STATUS_DONE)
+                ->where('reference', env('REFERENTIEL_VERSION'))
+                ->with('dangerLevels')
+                ->with('measureLevels')
+                ->with('measureLevels.measure')
+                ->with('organization')
+                ->orderBy('updated_at', 'DESC')
+                ->first();
         }
 
-        $collectionAction = collect($evaluation->measureLevels)->filter(function (MeasureLevel $ml) {
-            return null !== $ml->expected_level && $ml->actual_level < 3 && $ml->actual_level !== $ml->expected_level;
-        });
-        $actionSorted = $collectionAction->sortBy('end_date');
-        $actionSorted = $actionSorted->values()->all();
+        $actionSorted = $this->getActionSorted($evaluation);
 
-        $dangerLevels = DangerLevel::all();
+        $dangerLevels = DangerLevel::orderBy('value', 'asc')->get();
+        $attackData = $repository->getAttackDataForEvaluation($evaluation);
+
+        $attackColors = $attackData['labels']->map(function ($l, $i) use ($attackData) {
+            $color = GraphDataRepository::hslToRgb($i / count($attackData['labels']), 1, 0.7);
+            // return $color;
+            return '#' . sprintf('%x%x%x', $color[0], $color[1], $color[2]);
+        });
 
         $data = [
-            'plan_name' => 'Test plan',
             'organization' => $organization,
             'evaluation' => $evaluation,
+            'measures' => Measure::all(),
             'actions' => $actionSorted,
-            'elu' => 'test elu',
-            'agent' => 'test agent',
             'referentiel' => $evaluation->reference,
             'legendLevels' => $dangerLevels,
             'residualRisks' => $evaluation->getResidualDangers(),
             'measuresData' => $repository->getMeasuresDataForEvaluation($evaluation),
-            'attackData' => $repository->getAttackDataForEvaluation($evaluation),
+            'attackData' => $attackData,
+            'attackColors' => $attackColors->toArray(),
             'expositionData' => $repository->getExpositionDataForEvaluation($evaluation),
             'risksData' => $repository->getRisksDataForEvaluation($evaluation),
             'futureRisksData' => $repository->getFutureRisksDataForEvaluation($evaluation),
@@ -209,7 +210,7 @@ public function DossierCyberSecuritePdf(GraphDataRepository $repository)
             'date' => $evaluation->updated_at->format('d/m/Y'),
         ];
 
-//        return view('pdf.dossierCyberSecurite.dossier', $data);
+//        return view('pdf.dossierCyberSecurite.cover', $data);
 
         $pdf = App::make('snappy.pdf.wrapper');
         $pdf->loadView('pdf.dossierCyberSecurite.dossier', $data);
@@ -229,13 +230,23 @@ public function DossierCyberSecuritePdf(GraphDataRepository $repository)
         $pdf->setOption('margin-right', '8');
         $pdf->setOption('xsl-style-sheet', view('pdf.dossierCyberSecurite.toc', $data));
 
-        $filename = 'dossier_cybersecurite' . date('Y-m-d') . '.pdf';
+        $tempName = sys_get_temp_dir() . DIRECTORY_SEPARATOR . Str::random() . '.pdf';
+        $pdf->save($tempName);
+
+        return response()->download($tempName);
+    }
 
-        if (file_exists(storage_path('app/dossier_cybersecurite/' . $filename))) {
-            unlink(storage_path('app/dossier_cybersecurite/' . $filename));
+    public function getActionSorted(Evaluation|null $evaluation): array
+    {
+        if (!$evaluation) {
+            abort(404);
         }
-        $pdf->save(storage_path('app/dossier_cybersecurite/' . $filename));
 
-        return Storage::download('dossier_cybersecurite/' . $filename, 'Dossier cybersécurité - ' . date('Y-m-d') . '.pdf');
+        $collectionAction = collect($evaluation->measureLevels)->filter(function (MeasureLevel $ml) {
+            return null !== $ml->expected_level && 0 !== $ml->expected_level && $ml->actual_level < 3 && $ml->actual_level !== $ml->expected_level;
+        });
+        $actionSorted = $collectionAction->sortBy('end_date');
+
+        return $actionSorted->values()->all();
     }
 }
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 6ead053daab356d056193e79cde1a9d987823c7e..b7301f0007b7e2030e37f8d689a79bfceb89f687 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -40,7 +40,8 @@ class Kernel extends HttpKernel
 
         'api' => [
              \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
-            'throttle:api',
+//            'throttle:api',
+            'throttle:6000,1',
             \Illuminate\Routing\Middleware\SubstituteBindings::class,
         ],
     ];
diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php
index 8cfc2bf1a691de20c2e1ae62e06aac09836c6072..928e9aec6b4ff8d84fe60902bb845653e97503ca 100644
--- a/app/Http/Middleware/RedirectIfAuthenticated.php
+++ b/app/Http/Middleware/RedirectIfAuthenticated.php
@@ -3,7 +3,6 @@
 namespace App\Http\Middleware;
 
 use App\Providers\RouteServiceProvider;
-use Closure;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -17,7 +16,7 @@ class RedirectIfAuthenticated
      *
      * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
      */
-    public function handle(Request $request, Closure $next, ...$guards)
+    public function handle(Request $request, \Closure $next, ...$guards)
     {
         $guards = empty($guards) ? [null] : $guards;
 
diff --git a/app/Http/Requests/NewPasswordRequest.php b/app/Http/Requests/NewPasswordRequest.php
index b7aab9dd1b9ccdbe458d2c6fde78e5b4e3965cb7..9db483c953b3b11de72a7e451f806ff6f5258f84 100644
--- a/app/Http/Requests/NewPasswordRequest.php
+++ b/app/Http/Requests/NewPasswordRequest.php
@@ -37,9 +37,9 @@ public function withValidator(Validator $validator)
 
         $validator->after(
             function ($validator) use ($newpassword) {
-                if (strlen($newpassword) < 6) {
+                if (strlen($newpassword) < 12) {
                     $validator->errors()->add(
-                        'newpassword', 'Le mot de passe doit contenir 6 caractères minimum.'
+                        'newpassword', 'Le mot de passe doit contenir 12 caractères minimum.'
                     );
                 }
 
@@ -49,9 +49,19 @@ function ($validator) use ($newpassword) {
                     );
                 }
 
-                if (!preg_match('/[a-zA-Z]/', $newpassword)) {
+                if (!preg_match('/[a-z]/', $newpassword)) {
                     $validator->errors()->add(
-                        'newpassword', 'Le mot de passe doit contenir au moins une lettre.'
+                        'newpassword', 'Le mot de passe doit contenir au moins une lettre minuscule.'
+                    );
+                }
+                if (!preg_match('/[A-Z]/', $newpassword)) {
+                    $validator->errors()->add(
+                        'newpassword', 'Le mot de passe doit contenir au moins une lettre majuscule.'
+                    );
+                }
+                if (!preg_match('/[^a-zA-Z0-9]/', $newpassword)) {
+                    $validator->errors()->add(
+                        'newpassword', 'Le mot de passe doit contenir au moins un caractère spécial.'
                     );
                 }
             }
diff --git a/app/Http/Requests/UserRequest.php b/app/Http/Requests/UserRequest.php
index 36b8e7a86625f3293e913d0a982675a2e8278358..1fbe2d7b3731b4d4d6d3b87a8a1f80301f46f49b 100644
--- a/app/Http/Requests/UserRequest.php
+++ b/app/Http/Requests/UserRequest.php
@@ -30,7 +30,7 @@ public function rules()
             'lastname' => 'string|nullable',
             'email' => 'nullable|email',
             'organization_id' => 'int|nullable',
-            'password' => 'string|nullable',
+            'password' => 'string|nullable|min:12|regex:/[0-9]/',
             'role' => 'int',
             'last_login' => 'string|nullable',
             'civility' => 'string|required',
diff --git a/app/Http/Resources/EvaluationExportResource.php b/app/Http/Resources/EvaluationExportResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5ef48afc621817104204695db1248125bfb7f19
--- /dev/null
+++ b/app/Http/Resources/EvaluationExportResource.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Enums\MaturityQuestionNames;
+use App\Models\DangerLevelEvaluation;
+use App\Models\Evaluation;
+use App\Models\MaturityAnswer;
+use App\Models\Measure;
+use App\Models\MeasureLevel;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Collection as EloquentCollection;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Support\Collection;
+
+class EvaluationExportResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param Request $request
+     */
+    public function toArray($request): array
+    {
+        /** @var Evaluation $evaluation */
+        $evaluation = $this->resource;
+
+        $res = [
+            'organizationId' => $evaluation->organization_id, //    -Collectivité id
+            'updatedDate' => $evaluation->updated_at->isoFormat('DD/MM/YYYY'), //    - Date de modification
+            'updatedBy' => $evaluation->updated_by, //    - Modifié par
+            'reference' => $evaluation->reference, //    - Référentiel
+            'status' => Evaluation::STATUS[$evaluation->status], //    - Statut de l’évaluation
+
+            // ***
+//            'statusDangers' => '!TODO', //    - Statut Dangers @todo ??? quelle est la valeur attendue
+            // ***
+        ];
+
+        $dangerLevelEvaluations = $evaluation->dangerLevels ?? collect();
+
+        foreach ([1, 2, 3, 4, 5, 6] as $dangerId) {
+            /** @var ?DangerLevelEvaluation $dangerLevelEvaluation */
+            $dangerLevelEvaluation = $dangerLevelEvaluations->where('danger_id', '=', $dangerId)->first();
+            $res["dangerLevel_$dangerId"] = (string) $dangerLevelEvaluation?->level?->name; //    - perception du danger X
+        }
+
+        $mesures = Measure::orderBy('fundamental', 'ASC')->get();
+        $mesureLevels = $evaluation->measureLevels ?? collect();
+        foreach ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as $questionId) {
+            /** @var ?Measure $mesure */
+            $mesure = $mesures->get($questionId - 1);
+            /** @var ?MeasureLevel $mesureLevel */
+            $mesureLevel = $mesureLevels->where('measure_id', '=', $mesure->id)->first();
+
+            $actualLevel = $mesureLevel?->actual_level;
+            $res["q$questionId"] = $mesure->name;
+            if ($actualLevel) {
+                $res["q$questionId"] .= PHP_EOL . $mesure->getAttribute('level' . $actualLevel . '_actual_label');
+            }
+        }
+
+        $maturityLevelAnswers = $evaluation->maturityLevels()->with(['question', 'answer'])->get();
+
+        return [...$res,
+            'actionPlan' => $this->_getActionPlanString($mesureLevels), //    - Plan d’action
+            'motivation' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::MOTIVATION)?->name, //    - Motivation
+            'execution' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::EXECUTION)?->name, //    - Execution
+            'fundamental' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::FUNDAMENTALS)?->name, //    - Fondamentaux
+            'organization' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::ORGANIZATION)?->name, //    - Organisation
+            'maturityCyber' => $evaluation->maturity_cyber, //    - Indice de maturité
+        ];
+    }
+
+    private function _getAnswerForQuestionName(?EloquentCollection $maturityLevelAnswers, MaturityQuestionNames $name): ?MaturityAnswer
+    {
+        return $maturityLevelAnswers?->firstWhere('question.title', '=', $name->value)?->answer;
+    }
+
+    private function _getActionPlanString(Collection $mesureLevels): string
+    {
+        $actionPlan = [];
+        foreach ($mesureLevels as $mesureLevel) {
+            if ($mesureLevel->expected_level > $mesureLevel->actual_level) {
+                $actionPlan[] = implode(';', [
+                    $mesureLevel->measure->short_name,
+                    '[' . $mesureLevel->actual_level . ' >> ' . $mesureLevel->expected_level . ']',
+                    (new Carbon($mesureLevel->end_date))->isoFormat('DD/MM/YYYY'),
+                    $mesureLevel->manager,
+                ]);
+            }
+        }
+
+        return implode(PHP_EOL, $actionPlan);
+    }
+}
diff --git a/app/Http/Resources/OrganizationExportResource.php b/app/Http/Resources/OrganizationExportResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..47bb499c47ffe9c1c5de9ac2d06ee93eef15c21b
--- /dev/null
+++ b/app/Http/Resources/OrganizationExportResource.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Enums\MaturityQuestionNames;
+use App\Models\DangerLevelEvaluation;
+use App\Models\Evaluation;
+use App\Models\MaturityAnswer;
+use App\Models\MeasureLevel;
+use App\Models\Organization;
+use Illuminate\Database\Eloquent\Collection as EloquentCollection;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class OrganizationExportResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param Request $request
+     */
+    public function toArray($request): array
+    {
+        /** @var Organization $organization */
+        $organization = $this->resource;
+
+        $evaluation = $organization->doneEvaluations()->limit(2)->get();
+        /** @var ?Evaluation $lastEvaluation */
+        $lastEvaluation = $evaluation->first();
+        /** @var ?Evaluation $previousEvaluation */
+        $previousEvaluation = $evaluation->get(1);
+
+        $res = [
+            'name' => $organization->name, //    - nom de la collectivité
+            'shortName' => $organization->short_name, //    - nom court
+            'territory' => (string) $organization->territory?->name, //    - libellé territoire
+            'type' => $organization->type, //    - type de structure
+            'insee' => $organization->address->codeInsee, //    - insee
+            'siren' => $organization->siren, //    - siren
+            'active' => $organization->active, //    - actif
+            'website' => $organization->website, //    - site internet
+            'info' => $organization->info, //    - infos complémentaires
+            'fullAddress' => (string) $organization->address, //    - adresses (tous les champs)
+            'referent' => (string) $organization->referent, //     - référents et responsable (tous les champs)
+            'referentCyber' => (string) $organization->referentCyber,
+            'referentElu' => (string) $organization->referentElu,
+            'lastEvaluation.cyberMaturity' => (float) $lastEvaluation?->maturity_cyber, //     - score indice maturité cyber
+            'previousEvaluation.cyberMaturity' => (float) $previousEvaluation?->maturity_cyber, //    - score indice maturité cyber n-1
+        ];
+
+        $measureLevels = $lastEvaluation?->measureLevels ?? collect();
+
+        foreach ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as $measureKey) {
+            /** @var ?MeasureLevel $measureLevel */
+            $measureLevel = $measureLevels->get($measureKey - 1);
+            $res["measure$measureKey.actualLevel"] = (string) $measureLevel?->actual_level; //    - niveau de mise en Å“uvre mesure X
+        }
+
+        foreach ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as $measureKey) {
+            /** @var ?MeasureLevel $measureLevel */
+            $measureLevel = $measureLevels->get($measureKey - 1);
+            $res["measure$measureKey.expectedLevel"] = (string) $measureLevel?->expected_level; //    - niveau de planification mesure X
+        }
+
+        $maturityLevelAnswers = $lastEvaluation?->maturityLevels()->with(['question', 'answer'])->get();
+
+        $res = [...$res,
+            'executionLevel' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::EXECUTION)?->name,  // niveau d'exécution
+            'createdDate' => $organization->created_at->isoFormat('DD/MM/YYYY'), // date création de la collectivité
+            'lastEvaluation.reference' => (string) $lastEvaluation?->reference, //     - version du référentiel
+            'lastEvaluation.updatedBy' => (string) $lastEvaluation?->updated_by, //     - évaluation modifiée par
+            'lastEvaluation.author' => (string) $lastEvaluation?->author, //     - évaluation crée par
+        ];
+
+        $dangerLevelEvaluations = $lastEvaluation?->dangerLevels ?? collect();
+
+        foreach ([1, 2, 3, 4, 5, 6] as $dangerId) {
+            /** @var ?DangerLevelEvaluation $dangerLevelEvaluation */
+            $dangerLevelEvaluation = $dangerLevelEvaluations->where('danger_id', '=', $dangerId)->first();
+            $res["dangerLevel$dangerId"] = (string) $dangerLevelEvaluation?->level->name; //    - perception du danger X
+        }
+
+        return [...$res,
+            'maturityLevel.knowledge' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::KNOWLEDGE)?->name,  //     - niveau de connaissance
+            'maturityLevel.organization' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::ORGANIZATION)?->name,  //     - niveau d'organisation
+            'maturityLevel.motivation' => (string) $this->_getAnswerForQuestionName($maturityLevelAnswers, MaturityQuestionNames::MOTIVATION)?->name,  //     - niveau de motivation
+
+            'alert' => (bool) $lastEvaluation?->isThresholdNotExceeded(),  //     - seuil non dépassé (true/false)
+        ];
+    }
+
+    private function _getAnswerForQuestionName(?EloquentCollection $maturityLevelAnswers, MaturityQuestionNames $name): ?MaturityAnswer
+    {
+        return $maturityLevelAnswers?->firstWhere('question.title', '=', $name->value)?->answer;
+    }
+}
diff --git a/app/Mail/NotifForgotPassword.php b/app/Mail/NotifForgotPassword.php
index 1f8c5e95faea131669a628e2067ea3c3047b5b30..558c2862d2a4a0883ba2820e73a8a573aad9e95a 100644
--- a/app/Mail/NotifForgotPassword.php
+++ b/app/Mail/NotifForgotPassword.php
@@ -15,8 +15,6 @@ class NotifForgotPassword extends Mailable
     /**
      * /**
      * Create a new message instance.
-     *
-     * @param $user
      */
     public function __construct($user)
     {
diff --git a/app/Mail/NotifNewPassword.php b/app/Mail/NotifNewPassword.php
index 6f948fbdd4e64751700b6533e56e653328463257..f47317ecacd6f3299ece1e21909b12116c4ff4b3 100644
--- a/app/Mail/NotifNewPassword.php
+++ b/app/Mail/NotifNewPassword.php
@@ -15,8 +15,6 @@ class NotifNewPassword extends Mailable
     /**
      * /**
      * Create a new message instance.
-     *
-     * @param $user
      */
     public function __construct($user)
     {
diff --git a/app/Models/Address.php b/app/Models/Address.php
index 70053cf5dfb2c63498afcabc8e1edaaf1f6d2618..781a6fbc2b95cadf0d21a622592b94495b7cf987 100644
--- a/app/Models/Address.php
+++ b/app/Models/Address.php
@@ -2,12 +2,48 @@
 
 namespace App\Models;
 
+use Database\Factories\AddressFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Carbon;
 
+/**
+ * App\Models\Address.
+ *
+ * @property int         $id
+ * @property Carbon|null $created_at
+ * @property Carbon|null $updated_at
+ * @property string      $address
+ * @property string|null $moreInfos
+ * @property string      $cp
+ * @property string      $city
+ * @property string      $codeInsee
+ *
+ * @method static AddressFactory  factory(...$parameters)
+ * @method static Builder|Address newModelQuery()
+ * @method static Builder|Address newQuery()
+ * @method static Builder|Address query()
+ * @method static Builder|Address whereAddress($value)
+ * @method static Builder|Address whereCity($value)
+ * @method static Builder|Address whereCodeInsee($value)
+ * @method static Builder|Address whereCp($value)
+ * @method static Builder|Address whereCreatedAt($value)
+ * @method static Builder|Address whereId($value)
+ * @method static Builder|Address whereMoreInfos($value)
+ * @method static Builder|Address whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
+ */
 class Address extends Model
 {
     use HasFactory;
 
     protected $table = 'address';
+
+    public function __toString(): string
+    {
+        return implode(' ', [$this->address, $this->cp, $this->city]);
+    }
 }
diff --git a/app/Models/Contact.php b/app/Models/Contact.php
index c843206ac50d9a8b79384a1360057e0157b686ea..27f60b1c52bfa05ce93b74adc9e24fd23e71d620 100644
--- a/app/Models/Contact.php
+++ b/app/Models/Contact.php
@@ -2,10 +2,48 @@
 
 namespace App\Models;
 
+use Database\Factories\ContactFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Carbon;
 
+/**
+ * Class Contact.
+ *
+ * @property int         $id
+ * @property string      $civility
+ * @property string      $firstname
+ * @property string      $lastname
+ * @property string      $function
+ * @property string      $email
+ * @property string      $phone
+ * @property Carbon|null $created_at
+ * @property Carbon|null $updated_at
+ *
+ * @method static ContactFactory  factory(...$parameters)
+ * @method static Builder|Contact newModelQuery()
+ * @method static Builder|Contact newQuery()
+ * @method static Builder|Contact query()
+ * @method static Builder|Contact whereCivility($value)
+ * @method static Builder|Contact whereCreatedAt($value)
+ * @method static Builder|Contact whereEmail($value)
+ * @method static Builder|Contact whereFirstname($value)
+ * @method static Builder|Contact whereFunction($value)
+ * @method static Builder|Contact whereId($value)
+ * @method static Builder|Contact whereLastname($value)
+ * @method static Builder|Contact wherePhone($value)
+ * @method static Builder|Contact whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
+ */
 class Contact extends Model
 {
     use HasFactory;
+
+    public function __toString(): string
+    {
+        return implode(' ', [$this->civility, $this->firstname, $this->lastname]);
+    }
 }
diff --git a/app/Models/Danger.php b/app/Models/Danger.php
index 6b79611d1251b80c5f5bc3fa5ac2661759c615de..03f1355ce78f6d19749f3f783d0b0a03cf873279 100644
--- a/app/Models/Danger.php
+++ b/app/Models/Danger.php
@@ -2,10 +2,14 @@
 
 namespace App\Models;
 
+use Database\Factories\DangerFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Collection;
 
 /**
@@ -15,6 +19,21 @@
  * @property string                $name
  * @property string                $description
  * @property Scenario[]|Collection $scenarios
+ * @property Carbon|null           $created_at
+ * @property Carbon|null           $updated_at
+ * @property int|null              $scenarios_count
+ *
+ * @method static DangerFactory  factory(...$parameters)
+ * @method static Builder|Danger newModelQuery()
+ * @method static Builder|Danger newQuery()
+ * @method static Builder|Danger query()
+ * @method static Builder|Danger whereCreatedAt($value)
+ * @method static Builder|Danger whereDescription($value)
+ * @method static Builder|Danger whereId($value)
+ * @method static Builder|Danger whereName($value)
+ * @method static Builder|Danger whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class Danger extends Model
 {
diff --git a/app/Models/DangerLevel.php b/app/Models/DangerLevel.php
index 797b6b88b43dfbd97e3ee8c641c3e6a970597199..08a3b0fbb1f14b01752d853f531401fdf68b8b78 100644
--- a/app/Models/DangerLevel.php
+++ b/app/Models/DangerLevel.php
@@ -2,20 +2,41 @@
 
 namespace App\Models;
 
+use Database\Factories\DangerLevelFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Carbon;
 
 /**
  * Class DangerLevel.
  *
- * @property int    $id
- * @property string $name
- * @property string $color
- * @property Danger $danger
- * @property int    $danger_id
- * @property string $description
- * @property int    $value
+ * @property int         $id
+ * @property string      $name
+ * @property string      $color
+ * @property Danger      $danger
+ * @property int         $danger_id
+ * @property string      $description
+ * @property int         $value
+ * @property Carbon|null $created_at
+ * @property Carbon|null $updated_at
+ * @property int|void    $points
+ *
+ * @method static DangerLevelFactory  factory(...$parameters)
+ * @method static Builder|DangerLevel newModelQuery()
+ * @method static Builder|DangerLevel newQuery()
+ * @method static Builder|DangerLevel query()
+ * @method static Builder|DangerLevel whereColor($value)
+ * @method static Builder|DangerLevel whereCreatedAt($value)
+ * @method static Builder|DangerLevel whereDescription($value)
+ * @method static Builder|DangerLevel whereId($value)
+ * @method static Builder|DangerLevel whereName($value)
+ * @method static Builder|DangerLevel whereUpdatedAt($value)
+ * @method static Builder|DangerLevel whereValue($value)
+ *
+ * @mixin Eloquent
  */
 class DangerLevel extends Model
 {
diff --git a/app/Models/DangerLevelEvaluation.php b/app/Models/DangerLevelEvaluation.php
index 0c98815ea3985ad128a89b92080b41e80e2a4da9..85c754abe2f2160ca5c440aff28651e6e37673bb 100644
--- a/app/Models/DangerLevelEvaluation.php
+++ b/app/Models/DangerLevelEvaluation.php
@@ -2,10 +2,13 @@
 
 namespace App\Models;
 
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Carbon;
 
 /**
  * Class DangerLevelEvaluation.
@@ -17,6 +20,20 @@
  * @property int         $evaluation_id
  * @property DangerLevel $level
  * @property int         $danger_level_id
+ * @property Carbon|null $created_at
+ * @property Carbon|null $updated_at
+ *
+ * @method static Builder|DangerLevelEvaluation newModelQuery()
+ * @method static Builder|DangerLevelEvaluation newQuery()
+ * @method static Builder|DangerLevelEvaluation query()
+ * @method static Builder|DangerLevelEvaluation whereCreatedAt($value)
+ * @method static Builder|DangerLevelEvaluation whereDangerId($value)
+ * @method static Builder|DangerLevelEvaluation whereDangerLevelId($value)
+ * @method static Builder|DangerLevelEvaluation whereEvaluationId($value)
+ * @method static Builder|DangerLevelEvaluation whereId($value)
+ * @method static Builder|DangerLevelEvaluation whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class DangerLevelEvaluation extends Model
 {
diff --git a/app/Models/Evaluation.php b/app/Models/Evaluation.php
index 7dc3413bed971737d63293c3735ac99e6622ef7b..283c08fa64b0b3f1d7a6efa71dd49a0862f6ad2e 100644
--- a/app/Models/Evaluation.php
+++ b/app/Models/Evaluation.php
@@ -2,7 +2,11 @@
 
 namespace App\Models;
 
-use DateTime;
+use App\Calculator\MaturityAnswerLevelCalculator;
+use Carbon\Carbon;
+use Database\Factories\EvaluationFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
@@ -14,16 +18,15 @@
  * Class Evaluation.
  *
  * @property int                                                             $id
- * @property DateTime                                                        $createdAt
- * @property DateTime                                                        $updatedAt
- * @property DateTime                                                        $updated_at
- * @property DateTime                                                        $created_at
+ * @property \DateTime                                                       $createdAt
+ * @property Carbon                                                          $updatedAt
+ * @property Carbon                                                          $updated_at
+ * @property \DateTime                                                       $created_at
  * @property DangerLevelEvaluation[]|Collection<DangerLevelEvaluation>       $dangerLevels
  * @property DangerLevelEvaluation[]|Collection<DangerLevelEvaluation>       $danger_levels
  * @property MeasureLevel[]|Collection<MeasureLevel>                         $measureLevels
  * @property MeasureLevel[]|Collection<MeasureLevel>                         $measure_levels
  * @property EvaluationMaturityAnswer[]|Collection<EvaluationMaturityAnswer> $maturityLevels
- * @property EvaluationMaturityAnswer[]|Collection<EvaluationMaturityAnswer> $maturity_levels
  * @property int                                                             $status
  * @property Organization                                                    $organization
  * @property int                                                             $organization_id
@@ -31,6 +34,28 @@
  * @property int                                                             $current_step_status
  * @property string                                                          $author
  * @property string                                                          $updated_by
+ * @property float                                                           $maturityCyber
+ * @property float                                                           $maturity_cyber
+ * @property string                                                          $reference
+ * @property int|null                                                        $danger_levels_count
+ * @property int|null                                                        $maturity_levels_count
+ * @property int|null                                                        $measure_levels_count
+ *
+ * @method static EvaluationFactory  factory(...$parameters)
+ * @method static Builder|Evaluation newModelQuery()
+ * @method static Builder|Evaluation newQuery()
+ * @method static Builder|Evaluation query()
+ * @method static Builder|Evaluation whereAuthor($value)
+ * @method static Builder|Evaluation whereCreatedAt($value)
+ * @method static Builder|Evaluation whereCurrentStep($value)
+ * @method static Builder|Evaluation whereId($value)
+ * @method static Builder|Evaluation whereOrganizationId($value)
+ * @method static Builder|Evaluation whereReference($value)
+ * @method static Builder|Evaluation whereStatus($value)
+ * @method static Builder|Evaluation whereUpdatedAt($value)
+ * @method static Builder|Evaluation whereUpdatedBy($value)
+ *
+ * @mixin Eloquent
  */
 class Evaluation extends Model
 {
@@ -52,6 +77,14 @@ class Evaluation extends Model
         self::STATUS_DONE => 'Terminé',
     ];
 
+    protected $appends = [
+        'maturity_cyber',
+    ];
+
+    protected $casts = [
+        'maturity_cyber' => 'float',
+    ];
+
     public function dangerLevels(): HasMany
     {
         return $this->hasMany(DangerLevelEvaluation::class);
@@ -100,4 +133,91 @@ public function getResidualDangers()
             return $scenario->dangers;
         })->flatten(1)->unique('id');
     }
+
+    public function getMaturityCyberAttribute(): float
+    {
+        if ($this->current_step < self::STEP_RESULTS) {
+            return 0.0;
+        }
+        $this->saveAutomaticAnswers();
+
+        $evaluation = Evaluation::find($this->id);
+
+        $maturityLevels = $evaluation->maturityLevels;
+
+        return $maturityLevels->map(function (EvaluationMaturityAnswer $ml) {
+            return $ml->answer->level;
+        })->avg();
+    }
+
+    public function saveAutomaticAnswers()
+    {
+        $questions = MaturityQuestion::where('auto', true)->get();
+        foreach ($questions as $question) {
+            // Calculate answer based on data
+            // For "execution"
+            // Get completed evaluation before this one
+            // If there are none then all calculated levels are 0
+            // (nombre de mesure basculée en mesure en place dans l'évaluation en cours/nombre de mesure prévue dans évaluation précédente) *100
+            // 0 => level 0
+            // 0 < calculated_level < 20 => level 1
+            // 20 < calculated_level < 80 => level 2
+            // calculated_level >= 80 => level 3
+            // For "fondamentaux"
+            // MOYENNE.INF( niveau de la mesure en place sauvegarde, niveau de la mesure en place mot de passe, niveau de la mesure en place mise à jour , niveau de la mesure en place sensibilisation)
+
+            $calculated_level = 0;
+            if ('Fondamentaux' === $question->title) {
+                $calculated_level = MaturityAnswerLevelCalculator::calculateFundamentalLevel($this);
+            }
+
+            if ('Exécution' === $question->title) {
+                // Get previous completed evaluation
+                /**
+                 * @var Evaluation|null $previousEvaluation
+                 */
+                $previousEvaluation = Evaluation::where('status', Evaluation::STATUS_DONE)
+                    ->where('organization_id', $this->organization_id)
+                    ->whereDate('updated_at', '<', $this->updated_at->toDateString())
+                    ->orderBy('updated_at', 'DESC')
+                    ->first();
+                $calculated_level = MaturityAnswerLevelCalculator::calculateExecutionLevel($this, $previousEvaluation);
+            }
+
+            $answer = MaturityAnswer::where('maturity_question_id', $question->id)
+                ->where('level', $calculated_level)
+                ->first();
+
+            $evalAnswer = EvaluationMaturityAnswer::where('evaluation_id', $this->id)
+                ->where('maturity_question_id', $question->id)
+                ->first();
+            if (!$evalAnswer) {
+                $evalAnswer = new EvaluationMaturityAnswer();
+            }
+
+            $evalAnswer->maturity_question_id = $question->id;
+            $evalAnswer->maturity_answer_id = $answer?->id;
+            $evalAnswer->evaluation_id = $this->id;
+            $evalAnswer->save();
+        }
+    }
+
+    public static function getThreshold(): float
+    {
+        return env('SEUIL_ALERTE'); // TODO use config instead of direct ENV
+    }
+
+    /**
+     * true if OK.
+     */
+    public function isThresholdNotExceeded(): bool
+    {
+        foreach ($this->measureLevels as $measureLevel) {
+            if ($measureLevel->actual_level < self::getThreshold()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
diff --git a/app/Models/EvaluationMaturityAnswer.php b/app/Models/EvaluationMaturityAnswer.php
index 3681ad62db0f6503352a9bd4501e2323bdfa0e17..ea10ad288d6c1876fab59e48a14eefc9c6ced16a 100644
--- a/app/Models/EvaluationMaturityAnswer.php
+++ b/app/Models/EvaluationMaturityAnswer.php
@@ -2,24 +2,42 @@
 
 namespace App\Models;
 
-use DateTime;
+use Database\Factories\EvaluationMaturityAnswerFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Carbon;
 
 /**
  * Class EvaluationMaturityAnswer.
  *
- * @property int $id
- * @property Evaluation$evaluation
+ * @property int              $id
+ * @property Evaluation       $evaluation
  * @property int              $evaluation_id
  * @property MaturityQuestion $question
  * @property int              $maturity_question_id
  * @property MaturityAnswer   $answer
  * @property int              $maturity_answer_id
- * @property DateTime         $createdAt
- * @property DateTime         $updatedAt
+ * @property \DateTime        $createdAt
+ * @property \DateTime        $updatedAt
+ * @property Carbon|null      $created_at
+ * @property Carbon|null      $updated_at
+ *
+ * @method static EvaluationMaturityAnswerFactory  factory(...$parameters)
+ * @method static Builder|EvaluationMaturityAnswer newModelQuery()
+ * @method static Builder|EvaluationMaturityAnswer newQuery()
+ * @method static Builder|EvaluationMaturityAnswer query()
+ * @method static Builder|EvaluationMaturityAnswer whereCreatedAt($value)
+ * @method static Builder|EvaluationMaturityAnswer whereEvaluationId($value)
+ * @method static Builder|EvaluationMaturityAnswer whereId($value)
+ * @method static Builder|EvaluationMaturityAnswer whereMaturityAnswerId($value)
+ * @method static Builder|EvaluationMaturityAnswer whereMaturityQuestionId($value)
+ * @method static Builder|EvaluationMaturityAnswer whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class EvaluationMaturityAnswer extends Model
 {
diff --git a/app/Models/MaturityAnswer.php b/app/Models/MaturityAnswer.php
index d181355c04985976db2ca59fa4b05231ffdf9f0f..7588bdc4e556d3bf6d354d2ed98231964f96f7bc 100644
--- a/app/Models/MaturityAnswer.php
+++ b/app/Models/MaturityAnswer.php
@@ -2,12 +2,15 @@
 
 namespace App\Models;
 
-use DateTime;
+use Database\Factories\MaturityAnswerFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Collection;
 
 /**
@@ -20,8 +23,25 @@
  * @property MaturityQuestion                     $question
  * @property int                                  $maturity_question_id
  * @property MaturityAnswer[]|iterable|Collection $evaluationMaturityAnswers
- * @property DateTime                             $createdAt
- * @property DateTime                             $updatedAt
+ * @property \DateTime                            $createdAt
+ * @property \DateTime                            $updatedAt
+ * @property Carbon|null                          $created_at
+ * @property Carbon|null                          $updated_at
+ * @property int|null                             $evaluation_maturity_answers_count
+ *
+ * @method static MaturityAnswerFactory  factory(...$parameters)
+ * @method static Builder|MaturityAnswer newModelQuery()
+ * @method static Builder|MaturityAnswer newQuery()
+ * @method static Builder|MaturityAnswer query()
+ * @method static Builder|MaturityAnswer whereCreatedAt($value)
+ * @method static Builder|MaturityAnswer whereId($value)
+ * @method static Builder|MaturityAnswer whereLevel($value)
+ * @method static Builder|MaturityAnswer whereMaturityQuestionId($value)
+ * @method static Builder|MaturityAnswer whereName($value)
+ * @method static Builder|MaturityAnswer whereSlug($value)
+ * @method static Builder|MaturityAnswer whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class MaturityAnswer extends Model
 {
diff --git a/app/Models/MaturityQuestion.php b/app/Models/MaturityQuestion.php
index a3d0e7406b45260a8bcd8cce14f0e8f5444479ba..c689070aed040295f0afdad02f6d5a4ca037aae1 100644
--- a/app/Models/MaturityQuestion.php
+++ b/app/Models/MaturityQuestion.php
@@ -2,11 +2,14 @@
 
 namespace App\Models;
 
-use DateTime;
+use Database\Factories\MaturityQuestionFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Support\Carbon;
 
 /**
  * Class MaturityQuestion.
@@ -18,8 +21,26 @@
  * @property string           $title
  * @property string           $subtitle
  * @property bool             $auto
- * @property DateTime         $createdAt
- * @property DateTime         $updatedAt
+ * @property \DateTime        $createdAt
+ * @property \DateTime        $updatedAt
+ * @property Carbon|null      $created_at
+ * @property Carbon|null      $updated_at
+ * @property int|null         $answers_count
+ *
+ * @method static MaturityQuestionFactory  factory(...$parameters)
+ * @method static Builder|MaturityQuestion newModelQuery()
+ * @method static Builder|MaturityQuestion newQuery()
+ * @method static Builder|MaturityQuestion query()
+ * @method static Builder|MaturityQuestion whereAuto($value)
+ * @method static Builder|MaturityQuestion whereCreatedAt($value)
+ * @method static Builder|MaturityQuestion whereId($value)
+ * @method static Builder|MaturityQuestion whereName($value)
+ * @method static Builder|MaturityQuestion whereSlug($value)
+ * @method static Builder|MaturityQuestion whereSubtitle($value)
+ * @method static Builder|MaturityQuestion whereTitle($value)
+ * @method static Builder|MaturityQuestion whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class MaturityQuestion extends Model
 {
diff --git a/app/Models/Measure.php b/app/Models/Measure.php
index 5d61f7f7abd578ba3e87cfa256e150527c713dbf..bc2c2efe86c0bc57a31ee8f43a9fa05c73bea923 100644
--- a/app/Models/Measure.php
+++ b/app/Models/Measure.php
@@ -2,6 +2,9 @@
 
 namespace App\Models;
 
+use Database\Factories\MeasureFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
@@ -9,6 +12,8 @@
 use Illuminate\Support\Collection;
 
 /**
+ * App\Models\Measure.
+ *
  * @property int                   $id
  * @property string                $name
  * @property string                $short_name
@@ -47,6 +52,53 @@
  * @property int                   $level2_value
  * @property int                   $level3_value
  * @property Scenario[]|Collection $scenarios
+ * @property string                $level0_actual_label
+ * @property int|null              $scenarios_count
+ *
+ * @method static MeasureFactory  factory(...$parameters)
+ * @method static Builder|Measure newModelQuery()
+ * @method static Builder|Measure newQuery()
+ * @method static Builder|Measure query()
+ * @method static Builder|Measure whereCreatedAt($value)
+ * @method static Builder|Measure whereFundamental($value)
+ * @method static Builder|Measure whereId($value)
+ * @method static Builder|Measure whereLevel0ActualLabel($value)
+ * @method static Builder|Measure whereLevel0Value($value)
+ * @method static Builder|Measure whereLevel1ActualLabel($value)
+ * @method static Builder|Measure whereLevel1Assistance($value)
+ * @method static Builder|Measure whereLevel1Cost($value)
+ * @method static Builder|Measure whereLevel1Description($value)
+ * @method static Builder|Measure whereLevel1Difficulty($value)
+ * @method static Builder|Measure whereLevel1Duration($value)
+ * @method static Builder|Measure whereLevel1File($value)
+ * @method static Builder|Measure whereLevel1Info($value)
+ * @method static Builder|Measure whereLevel1PreconizedLabel($value)
+ * @method static Builder|Measure whereLevel1Value($value)
+ * @method static Builder|Measure whereLevel2ActualLabel($value)
+ * @method static Builder|Measure whereLevel2Assistance($value)
+ * @method static Builder|Measure whereLevel2Cost($value)
+ * @method static Builder|Measure whereLevel2Description($value)
+ * @method static Builder|Measure whereLevel2Difficulty($value)
+ * @method static Builder|Measure whereLevel2Duration($value)
+ * @method static Builder|Measure whereLevel2File($value)
+ * @method static Builder|Measure whereLevel2Info($value)
+ * @method static Builder|Measure whereLevel2PreconizedLabel($value)
+ * @method static Builder|Measure whereLevel2Value($value)
+ * @method static Builder|Measure whereLevel3ActualLabel($value)
+ * @method static Builder|Measure whereLevel3Assistance($value)
+ * @method static Builder|Measure whereLevel3Cost($value)
+ * @method static Builder|Measure whereLevel3Description($value)
+ * @method static Builder|Measure whereLevel3Difficulty($value)
+ * @method static Builder|Measure whereLevel3Duration($value)
+ * @method static Builder|Measure whereLevel3File($value)
+ * @method static Builder|Measure whereLevel3Info($value)
+ * @method static Builder|Measure whereLevel3PreconizedLabel($value)
+ * @method static Builder|Measure whereLevel3Value($value)
+ * @method static Builder|Measure whereName($value)
+ * @method static Builder|Measure whereShortName($value)
+ * @method static Builder|Measure whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class Measure extends Model
 {
diff --git a/app/Models/MeasureLevel.php b/app/Models/MeasureLevel.php
index ce5cfd3f539c8ec0470294338156a10793ed356e..b524e72e6842723e36b6d97812be6d95b483e0cf 100644
--- a/app/Models/MeasureLevel.php
+++ b/app/Models/MeasureLevel.php
@@ -2,22 +2,44 @@
 
 namespace App\Models;
 
-use DateTime;
+use Database\Factories\MeasureLevelFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Carbon;
 
 /**
  * Class MeasureLevel.
  *
- * @property int           $id
- * @property Evaluation    $evaluation
- * @property int           $evaluation_id
- * @property Measure       $measure
- * @property int           $measure_id
- * @property int|null      $actual_level
- * @property int|null      $expected_level
- * @property DateTime|null $end_date
+ * @property int            $id
+ * @property Evaluation     $evaluation
+ * @property int            $evaluation_id
+ * @property Measure        $measure
+ * @property int            $measure_id
+ * @property int|null       $actual_level
+ * @property int|null       $expected_level
+ * @property \DateTime|null $end_date
+ * @property string|null    $manager
+ * @property Carbon|null    $created_at
+ * @property Carbon|null    $updated_at
+ *
+ * @method static MeasureLevelFactory  factory(...$parameters)
+ * @method static Builder|MeasureLevel newModelQuery()
+ * @method static Builder|MeasureLevel newQuery()
+ * @method static Builder|MeasureLevel query()
+ * @method static Builder|MeasureLevel whereActualLevel($value)
+ * @method static Builder|MeasureLevel whereCreatedAt($value)
+ * @method static Builder|MeasureLevel whereEndDate($value)
+ * @method static Builder|MeasureLevel whereEvaluationId($value)
+ * @method static Builder|MeasureLevel whereExpectedLevel($value)
+ * @method static Builder|MeasureLevel whereId($value)
+ * @method static Builder|MeasureLevel whereManager($value)
+ * @method static Builder|MeasureLevel whereMeasureId($value)
+ * @method static Builder|MeasureLevel whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class MeasureLevel extends Model
 {
diff --git a/app/Models/Organization.php b/app/Models/Organization.php
index 5152623545c3d1e8a8fa8ed8dbb011cf80b37eca..caf8a8af186d4330b1ec26e323718ebbd7bc5d07 100644
--- a/app/Models/Organization.php
+++ b/app/Models/Organization.php
@@ -2,38 +2,82 @@
 
 namespace App\Models;
 
+use Database\Factories\OrganizationFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Collection;
 
 /**
- * @property int                   $id
- * @property string                $name
- * @property string                $short_name
- * @property string                $type
- * @property string                $siren
- * @property bool                  $active
- * @property string                $website
- * @property string                $info
- * @property Address               $address
- * @property Contact               $referent
- * @property int                   $referent_id
- * @property Contact               $referent_cyber
- * @property Contact               $referentCyber
- * @property int                   $referent_cyber_id
- * @property Contact               $referent_elu
- * @property Contact               $referentElu
- * @property int                   $referent_elu_id
- * @property Evaluation[]|iterable $evaluations
- * @property int                   $territory_id
+ * App\Models\Organization.
+ *
+ * @property int                                                         $id
+ * @property string                                                      $name
+ * @property string                                                      $short_name
+ * @property string                                                      $type
+ * @property string                                                      $siren
+ * @property bool                                                        $active
+ * @property string                                                      $website
+ * @property string                                                      $info
+ * @property Address                                                     $address
+ * @property ?Contact                                                    $referent
+ * @property int                                                         $referent_id
+ * @property ?Contact                                                    $referentCyber
+ * @property int                                                         $referent_cyber_id
+ * @property ?Contact                                                    $referentElu
+ * @property int                                                         $referent_elu_id
+ * @property Evaluation[]|Collection<Evaluation>                         $evaluations
+ * @property Evaluation[]|Collection<Evaluation>                         $doneEvaluations
+ * @property int                                                         $territory_id
+ * @property Carbon|null                                                 $created_at
+ * @property Carbon|null                                                 $updated_at
+ * @property string|null                                                 $bilan1
+ * @property string|null                                                 $bilan2
+ * @property int|null                                                    $address_id
+ * @property int|null                                                    $done_evaluations_count
+ * @property int|null                                                    $evaluations_count
+ * @property \App\Models\Territory|null                                  $territory
+ * @property \Illuminate\Database\Eloquent\Collection|\App\Models\User[] $users
+ * @property int|null                                                    $users_count
+ *
+ * @method static OrganizationFactory  factory(...$parameters)
+ * @method static Builder|Organization newModelQuery()
+ * @method static Builder|Organization newQuery()
+ * @method static Builder|Organization query()
+ * @method static Builder|Organization whereActive($value)
+ * @method static Builder|Organization whereAddressId($value)
+ * @method static Builder|Organization whereBilan1($value)
+ * @method static Builder|Organization whereBilan2($value)
+ * @method static Builder|Organization whereCreatedAt($value)
+ * @method static Builder|Organization whereId($value)
+ * @method static Builder|Organization whereInfo($value)
+ * @method static Builder|Organization whereName($value)
+ * @method static Builder|Organization whereReferentCyberId($value)
+ * @method static Builder|Organization whereReferentEluId($value)
+ * @method static Builder|Organization whereReferentId($value)
+ * @method static Builder|Organization whereShortName($value)
+ * @method static Builder|Organization whereSiren($value)
+ * @method static Builder|Organization whereTerritoryId($value)
+ * @method static Builder|Organization whereType($value)
+ * @method static Builder|Organization whereUpdatedAt($value)
+ * @method static Builder|Organization whereWebsite($value)
+ *
+ * @mixin Eloquent
  */
 class Organization extends Model
 {
     use HasFactory;
     use HasTimestamps;
 
+    public $casts = [
+        'active' => 'boolean',
+    ];
+
     public function users(): HasMany
     {
         return $this->hasMany(User::class);
@@ -41,7 +85,12 @@ public function users(): HasMany
 
     public function evaluations(): HasMany
     {
-        return $this->hasMany(Evaluation::class);
+        return $this->hasMany(Evaluation::class)->orderBy('updated_at', 'desc');
+    }
+
+    public function doneEvaluations(): HasMany
+    {
+        return $this->evaluations()->where('status', Evaluation::STATUS_DONE);
     }
 
     public function address(): BelongsTo
diff --git a/app/Models/Scenario.php b/app/Models/Scenario.php
index 0393f848b425d46c983c9becd0fefac93aa9dbf5..978e60724c08b62ca2dc638b310f8e4b876188b5 100644
--- a/app/Models/Scenario.php
+++ b/app/Models/Scenario.php
@@ -2,10 +2,13 @@
 
 namespace App\Models;
 
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Concerns\HasTimestamps;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Collection;
 
 /**
@@ -15,6 +18,20 @@
  * @property string               $name
  * @property Danger[]|Collection  $dangers
  * @property Measure[]|Collection $measures
+ * @property Carbon|null          $created_at
+ * @property Carbon|null          $updated_at
+ * @property int|null             $dangers_count
+ * @property int|null             $measures_count
+ *
+ * @method static Builder|Scenario newModelQuery()
+ * @method static Builder|Scenario newQuery()
+ * @method static Builder|Scenario query()
+ * @method static Builder|Scenario whereCreatedAt($value)
+ * @method static Builder|Scenario whereId($value)
+ * @method static Builder|Scenario whereName($value)
+ * @method static Builder|Scenario whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class Scenario extends Model
 {
diff --git a/app/Models/Territory.php b/app/Models/Territory.php
index 9d7d5b475897c051cf4472df2ef0f5d25ab133bc..c2a112d2f5105cf5d2e2427989b5b9dc8b89a031 100644
--- a/app/Models/Territory.php
+++ b/app/Models/Territory.php
@@ -2,12 +2,33 @@
 
 namespace App\Models;
 
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Collection;
 
 /**
- * @property Organization $organization
+ * App\Models\Territory.
+ *
+ * @property int                                     $id
+ * @property string                                  $name
+ * @property Organization[]|Collection<Organization> $organizations
+ * @property Carbon|null                             $created_at
+ * @property Carbon|null                             $updated_at
+ * @property int|null                                $organizations_count
+ *
+ * @method static Builder|Territory newModelQuery()
+ * @method static Builder|Territory newQuery()
+ * @method static Builder|Territory query()
+ * @method static Builder|Territory whereCreatedAt($value)
+ * @method static Builder|Territory whereId($value)
+ * @method static Builder|Territory whereName($value)
+ * @method static Builder|Territory whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class Territory extends Model
 {
diff --git a/app/Models/User.php b/app/Models/User.php
index 8392a022845f7cb5f0dd5befa8ae0641279cf46f..7bee113da9a7f9ad141901c110802e2e47446c1a 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -2,26 +2,66 @@
 
 namespace App\Models;
 
+use Database\Factories\UserFactory;
+use Eloquent;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Foundation\Auth\User as Authenticatable;
+use Illuminate\Notifications\DatabaseNotification;
+use Illuminate\Notifications\DatabaseNotificationCollection;
 use Illuminate\Notifications\Notifiable;
+use Illuminate\Support\Carbon;
 use Lab404\Impersonate\Models\Impersonate;
 use Laravel\Sanctum\HasApiTokens;
+use Laravel\Sanctum\PersonalAccessToken;
 
 /**
- * @property int               $id
- * @property int               $role
- * @property string            $firstname
- * @property string            $lastname
- * @property string            $email
- * @property string            $password
- * @property string            $remember_token
- * @property string            $last_login
- * @property string            $email_verified_at
- * @property Organization|null $organization
- * @property int               $organization_id
- * @property bool              $active
+ * App\Models\User.
+ *
+ * @property int                                                   $id
+ * @property int                                                   $role
+ * @property string                                                $firstname
+ * @property string                                                $lastname
+ * @property string                                                $email
+ * @property string                                                $password
+ * @property string                                                $remember_token
+ * @property string                                                $last_login
+ * @property string                                                $email_verified_at
+ * @property Organization|null                                     $organization
+ * @property int                                                   $organization_id
+ * @property bool                                                  $active
+ * @property string                                                $civility
+ * @property string|null                                           $reset_token
+ * @property Carbon|null                                           $created_at
+ * @property Carbon|null                                           $updated_at
+ * @property DatabaseNotificationCollection|DatabaseNotification[] $notifications
+ * @property int|null                                              $notifications_count
+ * @property Collection|PersonalAccessToken[]                      $tokens
+ * @property int|null                                              $tokens_count
+ *
+ * @method static UserFactory  factory(...$parameters)
+ * @method static Builder|User newModelQuery()
+ * @method static Builder|User newQuery()
+ * @method static Builder|User query()
+ * @method static Builder|User whereActive($value)
+ * @method static Builder|User whereCivility($value)
+ * @method static Builder|User whereCreatedAt($value)
+ * @method static Builder|User whereEmail($value)
+ * @method static Builder|User whereEmailVerifiedAt($value)
+ * @method static Builder|User whereFirstname($value)
+ * @method static Builder|User whereId($value)
+ * @method static Builder|User whereLastLogin($value)
+ * @method static Builder|User whereLastname($value)
+ * @method static Builder|User whereOrganizationId($value)
+ * @method static Builder|User wherePassword($value)
+ * @method static Builder|User whereRememberToken($value)
+ * @method static Builder|User whereResetToken($value)
+ * @method static Builder|User whereRole($value)
+ * @method static Builder|User whereUpdatedAt($value)
+ *
+ * @mixin Eloquent
  */
 class User extends Authenticatable
 {
diff --git a/app/Repository/EvaluationRepository.php b/app/Repository/EvaluationRepository.php
index e8c06b8d19af900e96ae16b7a89fd8fc80985413..4802c79eaaf9efe2115788e3be433100bcced2c6 100644
--- a/app/Repository/EvaluationRepository.php
+++ b/app/Repository/EvaluationRepository.php
@@ -2,74 +2,14 @@
 
 namespace App\Repository;
 
-use App\Calculator\MaturityAnswerLevelCalculator;
 use App\Exceptions\MissingMaturityAnswerException;
 use App\Models\Evaluation;
 use App\Models\EvaluationMaturityAnswer;
-use App\Models\MaturityAnswer;
 use App\Models\MaturityQuestion;
 use Illuminate\Support\Collection;
 
 class EvaluationRepository
 {
-    private MaturityAnswerLevelCalculator $calculator;
-
-    public function __construct(MaturityAnswerLevelCalculator $calculator)
-    {
-        $this->calculator = $calculator;
-    }
-
-    public function saveAutomaticAnswers($evaluation)
-    {
-        $questions = MaturityQuestion::where('auto', true)->get();
-        foreach ($questions as $question) {
-            // Calculate answer based on data
-            // For "execution"
-            // Get completed evaluation before this one
-            // If there are none then all calculated levels are 0
-            // (nombre de mesure basculée en mesure en place dans l'évaluation en cours/nombre de mesure prévue dans évaluation précédente) *100
-            // 0 => level 0
-            // 0 < calculated_level < 20 => level 1
-            // 20 < calculated_level < 80 => level 2
-            // calculated_level >= 80 => level 3
-            // For "fondamentaux"
-            // MOYENNE.INF( niveau de la mesure en place sauvegarde, niveau de la mesure en place mot de passe, niveau de la mesure en place mise à jour , niveau de la mesure en place sensibilisation)
-
-            $calculated_level = 0;
-            if ('Fondamentaux' === $question->title) {
-                $calculated_level = $this->calculator->calculateFundamentalLevel($evaluation);
-            }
-
-            if ('Exécution' === $question->title) {
-                // Get previous completed evaluation
-                /**
-                 * @var Evaluation|null $previousEvaluation
-                 */
-                $previousEvaluation = Evaluation::where('status', Evaluation::STATUS_DONE)
-                    ->whereDate('updated_at', '<', $evaluation->updated_at->toDateString())
-                    ->orderBy('updated_at', 'DESC')
-                    ->first();
-                $calculated_level = $this->calculator->calculateExecutionLevel($evaluation, $previousEvaluation);
-            }
-
-            $answer = MaturityAnswer::where('maturity_question_id', $question->id)
-                ->where('level', $calculated_level)
-                ->first();
-
-            $evalAnswer = EvaluationMaturityAnswer::where('evaluation_id', $evaluation->id)
-                ->where('maturity_question_id', $question->id)
-                ->first();
-            if (!$evalAnswer) {
-                $evalAnswer = new EvaluationMaturityAnswer();
-            }
-
-            $evalAnswer->maturity_question_id = $question->id;
-            $evalAnswer->maturity_answer_id = $answer->id;
-            $evalAnswer->evaluation_id = $evaluation->id;
-            $evalAnswer->save();
-        }
-    }
-
     /**
      * Save maturity answers.
      *
@@ -94,6 +34,6 @@ public function saveMaturity(Evaluation $evaluation, Collection $answers, int $d
             $maturity->save();
         }
 
-        $this->saveAutomaticAnswers($evaluation);
+        $evaluation->saveAutomaticAnswers();
     }
 }
diff --git a/app/Repository/GraphDataRepository.php b/app/Repository/GraphDataRepository.php
index 9885ef4c4682eeebb3d3103c126c8c7dc74b4cbc..f950ae3e09a6bc79ed9172c971c0144be3c223ff 100644
--- a/app/Repository/GraphDataRepository.php
+++ b/app/Repository/GraphDataRepository.php
@@ -8,7 +8,11 @@
 use App\Models\EvaluationMaturityAnswer;
 use App\Models\Measure;
 use App\Models\MeasureLevel;
+use App\Models\Organization;
 use App\Models\Scenario;
+use App\Models\Territory;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
 
 class GraphDataRepository
 {
@@ -71,13 +75,19 @@ public function getExpositionDataForEvaluation(Evaluation $evaluation): array
                 return $dl->danger_id === $danger->id;
             });
 
+            // the points for this danger are the total points for this danger,
+            // divided by the number of appllicable scenarios
             $values[] = $v / $danger->scenarios->count() * $dangerLevel->level->getPointsAttribute();
         }
 
         $total = collect($values)->sum();
 
         $percentages = collect($values)->map(function ($val) use ($total) {
-            return $val / $total * 100;
+            if (0.0 === $val || 0.0 === $total) {
+                return 10;
+            }
+
+            return max(10, $val / $total * 100);
         });
 
         return [
@@ -109,7 +119,7 @@ public function getRisksDataForEvaluation(Evaluation $evaluation): array
                 return $acc + $exposition;
             }, 0);
 
-            $values[] = $v / $danger->scenarios->count();
+            $values[] = max(10, $v / $danger->scenarios->count());
         }
 
         return [
@@ -141,7 +151,7 @@ public function getFutureRisksDataForEvaluation(Evaluation $evaluation): array
                 return $acc + $exposition;
             }, 0);
 
-            $values[] = $v / $danger->scenarios->count();
+            $values[] = max(10, $v / $danger->scenarios->count());
         }
 
         return [
@@ -160,7 +170,7 @@ public function getAttackDataForEvaluation(Evaluation $evaluation): array
         // (fundamental measures count double)
 
         $values = $scenarios->map(function (Scenario $scenario) use ($measureLevels) {
-            return $this->getExpositionPointsForScenario($scenario, $measureLevels);
+            return max(10, $this->getExpositionPointsForScenario($scenario, $measureLevels));
         });
 
         return [
@@ -172,7 +182,7 @@ public function getAttackDataForEvaluation(Evaluation $evaluation): array
     public function getMaturityDataForEvaluation(Evaluation $evaluation): array
     {
         // Calculate automatic answer results
-        $this->repository->saveAutomaticAnswers($evaluation);
+        $evaluation->saveAutomaticAnswers();
 
         $evaluation = Evaluation::find($evaluation->id);
 
@@ -188,6 +198,95 @@ public function getMaturityDataForEvaluation(Evaluation $evaluation): array
         ];
     }
 
+    public function getBestMeasuresForEvaluation(Evaluation $evaluation): array
+    {
+        $measureLevels = collect($evaluation->measureLevels);
+
+        // For each danger, add all points of all measures that apply to the danger scenarios
+
+        $measures = Measure::all();
+
+        Log::info('____ Calcul des meilleures mesures pour l\'évaluation ' . $evaluation->id . ' ____');
+
+        $bestMeasures = array_map(function ($i) {return 0; }, array_flip($measures->pluck('id')->toArray()));
+
+        $res = DB::select('select measures.id, count(*) as qty from measures
+join measure_scenario on measures.id=measure_scenario.measure_id
+join danger_scenario on danger_scenario.scenario_id=measure_scenario.scenario_id
+group by measures.id');
+
+        $measureCount = [];
+
+        foreach ($res as $row) {
+            $measureCount[$row->id] = $row->qty;
+        }
+
+        /**
+         * @var DangerLevelEvaluation $dangerLevel
+         */
+        // Nous regardons chaque niveau de danger choisi à l'étape 1 pour cette évaluation
+        foreach ($evaluation->dangerLevels as $dangerLevel) {
+            Log::info('*** Danger ' . $dangerLevel->danger->name . ' ***');
+            Log::info('Ce danger appartient à ' . count($dangerLevel->danger->scenarios) . ' scenarios');
+            /**
+             * @var Scenario $scenario
+             */
+            // Pour chaque niveau de danger, nous regardons les scénarios qui sont liés au danger
+            foreach ($dangerLevel->danger->scenarios as $scenario) {
+                Log::info('--- Scenario ' . $scenario->name . ' ---');
+                Log::info('Ce scenario contient ' . count($scenario->measures) . ' mesures');
+                // Add points for this measure if there is a difference in exposition
+
+                // Pour chaque scenarios nous regardons les mesures qui l'affectent
+                foreach ($scenario->measures as $measure) {
+                    Log::info('- Mesure ' . $measure->short_name . ($measure->fundamental ? '(fondamentale) -' : ' -'));
+                    /**
+                     * @var MeasureLevel|null $selectedLevel
+                     */
+                    // Nous regardons quel niveau a été choisit à l'étape 2 pour cette mesure.
+                    $selectedLevel = $measureLevels->first(function (MeasureLevel $level) use ($measure) {
+                        return $measure->id === $level->measure_id;
+                    });
+                    Log::info('Niveau actuel de la mesure : ' . $selectedLevel->actual_level);
+
+                    if (!$selectedLevel) {
+                        // Si aucun niveau n'a été choisi pour cette mesure, nous lui mettons le niveau 0
+                        // Cela ne devrait pas être possible car le choix d'un niveau est obligatoire à l'étape 2
+                        // Toutefois, mieux vaut s'assurer de sa présence pour éviter un crash
+                        $selectedLevel = new MeasureLevel();
+                        $selectedLevel->actual_level = 0;
+                    }
+
+                    // La valeur du niveau actuel choisit pour cette mesure
+                    // (les mesures fondamentales sont déja multipliées par deux en base de données)
+                    $l1 = $measure->{'level' . $selectedLevel->actual_level . '_value'};
+                    Log::info('Valeur du niveau actuel : ' . $measure->{'level' . $selectedLevel->actual_level . '_value'});
+                    // La valeur du niveau juste au dessus du niveau actuel choisit pour cette mesure (avec un maximum de niveau 3)
+                    // (les mesures fondamentales sont déja multipliées par deux en base de données)
+                    $l2 = $measure->{'level' . min($selectedLevel->actual_level + 1, 3) . '_value'};
+                    Log::info('Valeur du niveau actuel + 1 : ' . $measure->{'level' . min($selectedLevel->actual_level + 1, 3) . '_value'});
+
+                    // La différence entre la valeur du niveau N + 1 et du niveau N (progression potentielle)
+                    // est pondérée par la perception du danger
+
+                    // puis ajouté au score pour cette mesure
+                    $ponderatedIncrement = ($l2 - $l1) * $dangerLevel->level->value / $measureCount[$measure->id];
+                    $bestMeasures[$measure->id] += $ponderatedIncrement;
+                    Log::info('Incrément pondéré : ' . $ponderatedIncrement);
+                    Log::info('Valeur courante de la mesure ' . $measure->id . ' (' . $measure->short_name . ') : ' . $bestMeasures[$measure->id]);
+                }
+            }
+        }
+
+        foreach ($bestMeasures as $k => $m) {
+            Log::info('Valeur finale de la mesure ' . $k . ' : ' . $m);
+        }
+
+        // Les mesures sont mises dans l'ordre du plus grand score au plus petit et renvoyées.
+
+        return collect($bestMeasures)->sortDesc()->keys()->toArray();
+    }
+
     private function getExpositionPointsForScenario(Scenario $scenario, $measureLevels): float
     {
         // Get prorated count of measures
@@ -203,7 +302,10 @@ private function getExpositionPointsForScenario(Scenario $scenario, $measureLeve
             $selectedLevel = $measureLevels->first(function (MeasureLevel $level) use ($measure) {
                 return $measure->id === $level->measure_id;
             });
-
+            if (!$selectedLevel) {
+                return $acc;
+            }
+            // fundamental measures count double
             return $acc + $measure->{'level' . $selectedLevel->actual_level . '_value'};
         }, 0);
 
@@ -226,6 +328,7 @@ private function getFutureExpositionPointsForScenario(Scenario $scenario, $measu
                 return $measure->id === $level->measure_id;
             });
 
+            // fundamental measures count double
             $val = $measure->{'level' . $selectedLevel->expected_level . '_value'};
             if (!$val) {
                 $val = $measure->{'level' . $selectedLevel->actual_level . '_value'};
@@ -236,4 +339,212 @@ private function getFutureExpositionPointsForScenario(Scenario $scenario, $measu
 
         return floor(100 - ($points / $count));
     }
+
+    public function getActionTerritoryGraphData(): array
+    {
+        // Pour cq territoire
+        // trouver les evals des structures
+        // sort les evals pour recup currentEvaluation & previousEvaluation
+        // puis plannedMeasures par structure
+        // puis doneMeasure par structure
+        // puis count par territoire
+
+        $territories = Territory::with([
+            'organizations',
+            'organizations.evaluations',
+            'organizations.evaluations.measureLevels',
+        ])->get();
+
+        $labels = [];
+        $plannedMeasures = [];
+        $doneMeasures = [];
+
+        foreach ($territories as $territory) {
+            /*
+             * @var Territory $territory
+             */
+            $labels[] = $territory->name;
+
+            $plannedMeasures[] = $territory->organizations->filter(function (Organization $org) {
+                return $org->active;
+            })->reduce(function ($acc, Organization $org) {
+                $doneEvaluations = $org->doneEvaluations;
+                if ($doneEvaluations->count() >= 2) {
+                    /**
+                     * @var Evaluation $currentEval
+                     */
+                    $currentEval = $doneEvaluations[0];
+
+                    // Get the number of planned actions in the current evaluation
+                    return $acc + $currentEval->measureLevels->filter(function (MeasureLevel $ml) {
+                        return null !== $ml->expected_level && 0 !== $ml->expected_level;
+                    })->count();
+                }
+
+                return $acc;
+            }, 0);
+
+            $doneMeasures[] = $territory->organizations->filter(function (Organization $org) {
+                return $org->active;
+            })->reduce(function ($acc, Organization $org) {
+                $doneEvaluations = $org->doneEvaluations;
+                if ($doneEvaluations->count() >= 2) {
+                    /**
+                     * @var Evaluation $currentEval
+                     */
+                    $currentEval = $doneEvaluations[0];
+                    /**
+                     * @var Evaluation $previousEval
+                     */
+                    $previousEval = $doneEvaluations[1];
+
+                    // Get the number of planned actions in the previous evaluation
+                    // that have reached the expected_level in the current evaluation
+                    return $acc + $currentEval->measureLevels->filter(function (MeasureLevel $ml) use ($previousEval) {
+                        $prevML = $previousEval->measureLevels->first(function (MeasureLevel $pml) use ($ml) {
+                            return $ml->measure_id === $pml->measure_id;
+                        });
+
+                        return $prevML && $ml->actual_level >= $prevML->expected_level;
+                    })->count();
+                }
+
+                return $acc;
+            }, 0);
+        }
+
+        return [
+            'labels' => $labels,
+            'data' => [$plannedMeasures, $doneMeasures],
+        ];
+    }
+
+    public function getOrganizationData(int|null $territory_id = null)
+    {
+        $orgQuery = Organization::where('active', true);
+
+        if ($territory_id) {
+            $orgQuery->where('territory_id', $territory_id);
+        }
+
+        $orgs = $orgQuery->get();
+
+        $count = $orgs->count();
+
+        if (0 === $count) {
+            return [
+                'maturity' => 0,        // Nombre de structures évaluées
+                'count' => 0,          // Indice de maturité moyen des structures actives
+                'top_measures' => [],                // Top 3 des niveaux de mesures planifiées (doit retourner le nom court de la mesure, le niveau et le nombre de structures concernées / ou directement le %)
+            ];
+        }
+
+        $meanMaturity = $orgs->reduce(function ($acc, Organization $organization) {
+            /**
+             * @var Evaluation|null $doneEvaluation
+             */
+            $doneEvaluation = $organization->doneEvaluations->first();
+
+            if (!$doneEvaluation) {
+                return $acc;
+            }
+
+            return $acc + $doneEvaluation->getMaturityCyberAttribute();
+        }, 0) / $count;
+
+        $topMeasures = [];
+
+        foreach ($orgs as $org) {
+            /**
+             * @var Evaluation|null $currentEvaluation
+             */
+            $currentEvaluation = $org->doneEvaluations->first();
+
+            if (!$currentEvaluation) {
+                continue;
+            }
+
+            foreach ($currentEvaluation->measureLevels as $level) {
+                if (!$level->expected_level) {
+                    continue;
+                }
+                if (array_key_exists($level->measure->short_name, $topMeasures)) {
+                    ++$topMeasures[$level->measure->short_name]['level' . $level->expected_level];
+                    ++$topMeasures[$level->measure->short_name]['organizations'];
+                } else {
+                    $topMeasures[$level->measure->short_name] = [
+                        'short_name' => $level->measure->short_name,
+                        'level1' => 1 === $level->expected_level ? 1 : 0,
+                        'level2' => 2 === $level->expected_level ? 1 : 0,
+                        'level3' => 3 === $level->expected_level ? 1 : 0,
+                        'organizations' => 1,
+                    ];
+                }
+            }
+        }
+
+        $topMeasures = collect($topMeasures)->map(function ($topMeasure) use ($count) {
+            $levelValues = [
+                1 => $topMeasure['level1'],
+                2 => $topMeasure['level2'],
+                3 => $topMeasure['level3'],
+            ];
+
+            $maxValue = max($levelValues);
+
+            $maxLevels = array_keys($levelValues, $maxValue);
+
+            return [
+                'short_name' => $topMeasure['short_name'],
+                'organizations' => $topMeasure['organizations'],
+                'max_levels' => collect($maxLevels)->sortDesc()->toArray(),
+                'max_value' => $maxValue,
+                'percentage' => 100 * $maxValue / $count,
+            ];
+        })->values()->sortBy('max_value', SORT_NUMERIC, true)->splice(0, 3)->toArray();
+
+        return [
+            'maturity' => $meanMaturity,        // Nombre de structures évaluées
+            'count' => $count,          // Indice de maturité moyen des structures actives
+            'top_measures' => $topMeasures,                // Top 3 des niveaux de mesures planifiées (doit retourner le nom court de la mesure, le niveau et le nombre de structures concernées / ou directement le %)
+        ];
+    }
+
+    public static function hue2rgb($p, $q, $t)
+    {
+        if ($t < 0) {
+            ++$t;
+        }
+        if ($t > 1) {
+            --$t;
+        }
+        if ($t < 1 / 6) {
+            return $p + ($q - $p) * 6 * $t;
+        }
+        if ($t < 1 / 2) {
+            return $q;
+        }
+        if ($t < 2 / 3) {
+            return $p + ($q - $p) * (2 / 3 - $t) * 6;
+        }
+
+        return $p;
+    }
+
+    public static function hslToRgb($h, $s, $l)
+    {
+        if (0 == $s) {
+            $r = $l;
+            $g = $l;
+            $b = $l; // achromatic
+        } else {
+            $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
+            $p = 2 * $l - $q;
+            $r = self::hue2rgb($p, $q, $h + 1 / 3);
+            $g = self::hue2rgb($p, $q, $h);
+            $b = self::hue2rgb($p, $q, $h - 1 / 3);
+        }
+
+        return [round($r * 255), round($g * 255), round($b * 255)];
+    }
 }
diff --git a/composer.json b/composer.json
index 755701bf676d70bcac3ba904a01fc9e395ac37a8..54d5263a522ecd892a7c1b5a870a4378f7bde845 100644
--- a/composer.json
+++ b/composer.json
@@ -10,24 +10,27 @@
         "barryvdh/laravel-snappy": "^1.0",
         "doctrine/dbal": "^3.3",
         "guzzlehttp/guzzle": "^7.4",
-        "h4cc/wkhtmltopdf-amd64": "^0.12.4",
         "h4cc/wkhtmltoimage-amd64": "^0.12.4",
+        "h4cc/wkhtmltopdf-amd64": "^0.12.4",
         "lab404/laravel-impersonate": "^1.7",
         "laravel/framework": "^9.11",
         "laravel/helpers": "^1.5",
         "laravel/sanctum": "^2.15",
-        "laravel/tinker": "^2.7"
+        "laravel/tinker": "^2.7",
+        "spatie/simple-excel": "^2.3",
+        "fakerphp/faker": "^1.9.1"
     },
     "require-dev": {
-        "fakerphp/faker": "^1.9.1",
+        "barryvdh/laravel-ide-helper": "^2.12",
         "friendsofphp/php-cs-fixer": "^3.8",
         "laravel/homestead": "^13.2",
-        "laravel/sail": "^1.0.1",
+        "laravel/sail": "^1.16",
         "mockery/mockery": "^1.4.4",
         "nunomaduro/collision": "^6.1",
         "nunomaduro/larastan": "^2.0",
         "phpstan/phpstan": "^1.7",
         "phpunit/phpunit": "^9.5.10",
+        "roave/security-advisories": "dev-latest",
         "spatie/laravel-ignition": "^1.0"
     },
     "autoload": {
diff --git a/composer.lock b/composer.lock
index fd70d00ebf3c791f384c7803644d917be845ba1c..8b61ad55e42b84254a88b649c13c5acfdf6ca87b 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": "976ab2c2ebd291956a823c5cd567cf45",
+    "content-hash": "aa55c09908dcc3199640d78621aa8f92",
     "packages": [
         {
             "name": "barryvdh/laravel-snappy",
@@ -86,26 +86,26 @@
         },
         {
             "name": "brick/math",
-            "version": "0.9.3",
+            "version": "0.10.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/brick/math.git",
-                "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae"
+                "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae",
-                "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae",
+                "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f",
+                "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f",
                 "shasum": ""
             },
             "require": {
                 "ext-json": "*",
-                "php": "^7.1 || ^8.0"
+                "php": "^7.4 || ^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": "4.25.0"
             },
             "type": "library",
             "autoload": {
@@ -130,32 +130,28 @@
             ],
             "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.10.2"
             },
             "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": "2022-08-10T22:54:19+00:00"
         },
         {
             "name": "dflydev/dot-access-data",
-            "version": "v3.0.1",
+            "version": "v3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
-                "reference": "0992cc19268b259a39e86f296da5f0677841f42c"
+                "reference": "f41715465d65213d644d3141a6a93081be5d3549"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c",
-                "reference": "0992cc19268b259a39e86f296da5f0677841f42c",
+                "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549",
+                "reference": "f41715465d65213d644d3141a6a93081be5d3549",
                 "shasum": ""
             },
             "require": {
@@ -166,7 +162,7 @@
                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
                 "scrutinizer/ocular": "1.6.0",
                 "squizlabs/php_codesniffer": "^3.5",
-                "vimeo/psalm": "^3.14"
+                "vimeo/psalm": "^4.0.0"
             },
             "type": "library",
             "extra": {
@@ -215,9 +211,9 @@
             ],
             "support": {
                 "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
-                "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1"
+                "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2"
             },
-            "time": "2021-08-13T13:06:58+00:00"
+            "time": "2022-10-27T11:44:00+00:00"
         },
         {
             "name": "doctrine/cache",
@@ -314,38 +310,38 @@
         },
         {
             "name": "doctrine/dbal",
-            "version": "3.3.7",
+            "version": "3.5.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/dbal.git",
-                "reference": "9f79d4650430b582f4598fe0954ef4d52fbc0a8a"
+                "reference": "88fa7e5189fd5ec6682477044264dc0ed4e3aa1e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f79d4650430b582f4598fe0954ef4d52fbc0a8a",
-                "reference": "9f79d4650430b582f4598fe0954ef4d52fbc0a8a",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/88fa7e5189fd5ec6682477044264dc0ed4e3aa1e",
+                "reference": "88fa7e5189fd5ec6682477044264dc0ed4e3aa1e",
                 "shasum": ""
             },
             "require": {
                 "composer-runtime-api": "^2",
                 "doctrine/cache": "^1.11|^2.0",
                 "doctrine/deprecations": "^0.5.3|^1",
-                "doctrine/event-manager": "^1.0",
-                "php": "^7.3 || ^8.0",
+                "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": "2022.1",
-                "phpstan/phpstan": "1.7.13",
-                "phpstan/phpstan-strict-rules": "^1.2",
-                "phpunit/phpunit": "9.5.20",
-                "psalm/plugin-phpunit": "0.16.1",
-                "squizlabs/php_codesniffer": "3.7.0",
-                "symfony/cache": "^5.2|^6.0",
-                "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0",
-                "vimeo/psalm": "4.23.0"
+                "doctrine/coding-standard": "11.0.0",
+                "jetbrains/phpstorm-stubs": "2022.3",
+                "phpstan/phpstan": "1.9.4",
+                "phpstan/phpstan-strict-rules": "^1.4",
+                "phpunit/phpunit": "9.5.27",
+                "psalm/plugin-phpunit": "0.18.4",
+                "squizlabs/php_codesniffer": "3.7.1",
+                "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."
@@ -405,7 +401,7 @@
             ],
             "support": {
                 "issues": "https://github.com/doctrine/dbal/issues",
-                "source": "https://github.com/doctrine/dbal/tree/3.3.7"
+                "source": "https://github.com/doctrine/dbal/tree/3.5.3"
             },
             "funding": [
                 {
@@ -421,7 +417,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-13T21:43:03+00:00"
+            "time": "2023-01-12T10:21:44+00:00"
         },
         {
             "name": "doctrine/deprecations",
@@ -468,34 +464,34 @@
         },
         {
             "name": "doctrine/event-manager",
-            "version": "1.1.2",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/event-manager.git",
-                "reference": "eb2ecf80e3093e8f3c2769ac838e27d8ede8e683"
+                "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32"
             },
             "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/750671534e0241a7c50ea5b43f67e23eb5c96f32",
+                "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1 || ^8.0"
+                "php": "^8.1"
             },
             "conflict": {
                 "doctrine/common": "<2.9"
             },
             "require-dev": {
-                "doctrine/coding-standard": "^9",
-                "phpstan/phpstan": "~1.4.10 || ^1.5.4",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "vimeo/psalm": "^4.22"
+                "doctrine/coding-standard": "^10",
+                "phpstan/phpstan": "^1.8.8",
+                "phpunit/phpunit": "^9.5",
+                "vimeo/psalm": "^4.28"
             },
             "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Doctrine\\Common\\": "lib/Doctrine/Common"
+                    "Doctrine\\Common\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -539,7 +535,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/2.0.0"
             },
             "funding": [
                 {
@@ -555,32 +551,32 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-27T22:18:11+00:00"
+            "time": "2022-10-12T20:59:15+00:00"
         },
         {
             "name": "doctrine/inflector",
-            "version": "2.0.4",
+            "version": "2.0.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/inflector.git",
-                "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
+                "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
-                "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
+                "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
                 "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": "^10",
+                "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"
             },
             "type": "library",
             "autoload": {
@@ -630,7 +626,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.6"
             },
             "funding": [
                 {
@@ -646,35 +642,37 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-10-22T20:16:43+00:00"
+            "time": "2022-10-20T09:10:12+00:00"
         },
         {
             "name": "doctrine/lexer",
-            "version": "1.2.3",
+            "version": "2.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/lexer.git",
-                "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
+                "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
-                "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+                "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
+                "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
                 "shasum": ""
             },
             "require": {
+                "doctrine/deprecations": "^1.0",
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
-                "doctrine/coding-standard": "^9.0",
+                "doctrine/coding-standard": "^9 || ^10",
                 "phpstan/phpstan": "^1.3",
                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "vimeo/psalm": "^4.11"
+                "psalm/plugin-phpunit": "^0.18.3",
+                "vimeo/psalm": "^4.11 || ^5.0"
             },
             "type": "library",
             "autoload": {
                 "psr-4": {
-                    "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+                    "Doctrine\\Common\\Lexer\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -706,7 +704,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/2.1.0"
             },
             "funding": [
                 {
@@ -722,20 +720,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-28T11:07:21+00:00"
+            "time": "2022-12-14T08:49:07+00:00"
         },
         {
             "name": "dragonmantank/cron-expression",
-            "version": "v3.3.1",
+            "version": "v3.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dragonmantank/cron-expression.git",
-                "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa"
+                "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8"
             },
             "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/782ca5968ab8b954773518e9e49a6f892a34b2a8",
+                "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8",
                 "shasum": ""
             },
             "require": {
@@ -775,7 +773,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.2"
             },
             "funding": [
                 {
@@ -783,29 +781,28 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-01-18T15:43:28+00:00"
+            "time": "2022-09-10T18:51:20+00:00"
         },
         {
             "name": "egulias/email-validator",
-            "version": "3.2.1",
+            "version": "3.2.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/egulias/EmailValidator.git",
-                "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715"
+                "reference": "b531a2311709443320c786feb4519cfaf94af796"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715",
-                "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715",
+                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b531a2311709443320c786feb4519cfaf94af796",
+                "reference": "b531a2311709443320c786feb4519cfaf94af796",
                 "shasum": ""
             },
             "require": {
-                "doctrine/lexer": "^1.2",
+                "doctrine/lexer": "^1.2|^2",
                 "php": ">=7.2",
                 "symfony/polyfill-intl-idn": "^1.15"
             },
             "require-dev": {
-                "php-coveralls/php-coveralls": "^2.2",
                 "phpunit/phpunit": "^8.5.8|^9.3.3",
                 "vimeo/psalm": "^4"
             },
@@ -843,7 +840,7 @@
             ],
             "support": {
                 "issues": "https://github.com/egulias/EmailValidator/issues",
-                "source": "https://github.com/egulias/EmailValidator/tree/3.2.1"
+                "source": "https://github.com/egulias/EmailValidator/tree/3.2.5"
             },
             "funding": [
                 {
@@ -851,7 +848,75 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-06-18T20:57:19+00:00"
+            "time": "2023-01-02T17:26:14+00:00"
+        },
+        {
+            "name": "fakerphp/faker",
+            "version": "v1.21.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FakerPHP/Faker.git",
+                "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d",
+                "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0",
+                "psr/container": "^1.0 || ^2.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "conflict": {
+                "fzaninotto/faker": "*"
+            },
+            "require-dev": {
+                "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": {
+                "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-main": "v1.21-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/FakerPHP/Faker/issues",
+                "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0"
+            },
+            "time": "2022-12-13T13:54:32+00:00"
         },
         {
             "name": "fruitcake/php-cors",
@@ -926,24 +991,24 @@
         },
         {
             "name": "graham-campbell/result-type",
-            "version": "v1.0.4",
+            "version": "v1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/GrahamCampbell/Result-Type.git",
-                "reference": "0690bde05318336c7221785f2a932467f98b64ca"
+                "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca",
-                "reference": "0690bde05318336c7221785f2a932467f98b64ca",
+                "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8",
+                "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0 || ^8.0",
-                "phpoption/phpoption": "^1.8"
+                "php": "^7.2.5 || ^8.0",
+                "phpoption/phpoption": "^1.9"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+                "phpunit/phpunit": "^8.5.28 || ^9.5.21"
             },
             "type": "library",
             "autoload": {
@@ -972,7 +1037,7 @@
             ],
             "support": {
                 "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
-                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4"
+                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0"
             },
             "funding": [
                 {
@@ -984,20 +1049,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-11-21T21:41:47+00:00"
+            "time": "2022-07-30T15:56:11+00:00"
         },
         {
             "name": "guzzlehttp/guzzle",
-            "version": "7.4.5",
+            "version": "7.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/guzzle/guzzle.git",
-                "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82"
+                "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
-                "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba",
+                "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba",
                 "shasum": ""
             },
             "require": {
@@ -1012,10 +1077,10 @@
                 "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",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23",
                 "psr/log": "^1.1 || ^2.0 || ^3.0"
             },
             "suggest": {
@@ -1025,8 +1090,12 @@
             },
             "type": "library",
             "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                },
                 "branch-alias": {
-                    "dev-master": "7.4-dev"
+                    "dev-master": "7.5-dev"
                 }
             },
             "autoload": {
@@ -1092,7 +1161,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.5.0"
             },
             "funding": [
                 {
@@ -1108,20 +1177,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-20T22:16:13+00:00"
+            "time": "2022-08-28T15:39:27+00:00"
         },
         {
             "name": "guzzlehttp/promises",
-            "version": "1.5.1",
+            "version": "1.5.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/guzzle/promises.git",
-                "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
+                "reference": "b94b2807d85443f9719887892882d0329d1e2598"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
-                "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
+                "reference": "b94b2807d85443f9719887892882d0329d1e2598",
                 "shasum": ""
             },
             "require": {
@@ -1176,7 +1245,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/1.5.2"
             },
             "funding": [
                 {
@@ -1192,20 +1261,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-10-22T20:56:57+00:00"
+            "time": "2022-08-28T14:55:35+00:00"
         },
         {
             "name": "guzzlehttp/psr7",
-            "version": "2.4.0",
+            "version": "2.4.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/guzzle/psr7.git",
-                "reference": "13388f00956b1503577598873fffb5ae994b5737"
+                "reference": "67c26b443f348a51926030c83481b85718457d3d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737",
-                "reference": "13388f00956b1503577598873fffb5ae994b5737",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d",
+                "reference": "67c26b443f348a51926030c83481b85718457d3d",
                 "shasum": ""
             },
             "require": {
@@ -1219,15 +1288,19 @@
                 "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": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                },
                 "branch-alias": {
                     "dev-master": "2.4-dev"
                 }
@@ -1291,7 +1364,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.4.3"
             },
             "funding": [
                 {
@@ -1307,7 +1380,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-20T21:43:11+00:00"
+            "time": "2022-10-26T14:07:24+00:00"
         },
         {
             "name": "h4cc/wkhtmltoimage-amd64",
@@ -1546,37 +1619,37 @@
         },
         {
             "name": "laravel/framework",
-            "version": "v9.22.1",
+            "version": "v9.47.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "b3b3dd43b9899f23df6d1d3e5390bd4662947a46"
+                "reference": "92810d88f9a4252095a56c05541b07940363367c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/b3b3dd43b9899f23df6d1d3e5390bd4662947a46",
-                "reference": "b3b3dd43b9899f23df6d1d3e5390bd4662947a46",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/92810d88f9a4252095a56c05541b07940363367c",
+                "reference": "92810d88f9a4252095a56c05541b07940363367c",
                 "shasum": ""
             },
             "require": {
                 "doctrine/inflector": "^2.0",
-                "dragonmantank/cron-expression": "^3.1",
-                "egulias/email-validator": "^3.1",
+                "dragonmantank/cron-expression": "^3.3.2",
+                "egulias/email-validator": "^3.2.1",
                 "ext-mbstring": "*",
                 "ext-openssl": "*",
                 "fruitcake/php-cors": "^1.2",
-                "laravel/serializable-closure": "^1.0",
-                "league/commonmark": "^2.2",
-                "league/flysystem": "^3.0.16",
+                "laravel/serializable-closure": "^1.2.2",
+                "league/commonmark": "^2.2.1",
+                "league/flysystem": "^3.8.0",
                 "monolog/monolog": "^2.0",
-                "nesbot/carbon": "^2.53.1",
+                "nesbot/carbon": "^2.62.1",
                 "nunomaduro/termwind": "^1.13",
                 "php": "^8.0.2",
                 "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.2.2",
-                "symfony/console": "^6.0",
+                "ramsey/uuid": "^4.7",
+                "symfony/console": "^6.0.9",
                 "symfony/error-handler": "^6.0",
                 "symfony/finder": "^6.0",
                 "symfony/http-foundation": "^6.0",
@@ -1585,8 +1658,9 @@
                 "symfony/mime": "^6.0",
                 "symfony/process": "^6.0",
                 "symfony/routing": "^6.0",
+                "symfony/uid": "^6.0",
                 "symfony/var-dumper": "^6.0",
-                "tijsverkoyen/css-to-inline-styles": "^2.2.2",
+                "tijsverkoyen/css-to-inline-styles": "^2.2.5",
                 "vlucas/phpdotenv": "^5.4.1",
                 "voku/portable-ascii": "^2.0"
             },
@@ -1632,24 +1706,28 @@
                 "illuminate/view": "self.version"
             },
             "require-dev": {
-                "aws/aws-sdk-php": "^3.198.1",
+                "ably/ably-php": "^1.0",
+                "aws/aws-sdk-php": "^3.235.5",
                 "doctrine/dbal": "^2.13.3|^3.1.4",
-                "fakerphp/faker": "^1.9.2",
-                "guzzlehttp/guzzle": "^7.2",
+                "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.4.4",
-                "orchestra/testbench-core": "^7.1",
+                "mockery/mockery": "^1.5.1",
+                "orchestra/testbench-core": "^7.16",
                 "pda/pheanstalk": "^4.0",
+                "phpstan/phpdoc-parser": "^1.15",
                 "phpstan/phpstan": "^1.4.7",
                 "phpunit/phpunit": "^9.5.8",
-                "predis/predis": "^1.1.9|^2.0",
+                "predis/predis": "^1.1.9|^2.0.2",
                 "symfony/cache": "^6.0"
             },
             "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.",
@@ -1661,16 +1739,18 @@
                 "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 and the ping methods on schedules (^7.2).",
+                "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 (^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.4.4).",
+                "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 (^9.5.8).",
-                "predis/predis": "Required to use the predis connector (^1.1.9|^2.0).",
+                "predis/predis": "Required to use the predis connector (^1.1.9|^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 (^6.0|^7.0).",
                 "symfony/cache": "Required to PSR-6 cache bridge (^6.0).",
@@ -1722,24 +1802,24 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2022-07-26T16:16:33+00:00"
+            "time": "2023-01-10T16:10:09+00:00"
         },
         {
             "name": "laravel/helpers",
-            "version": "v1.5.0",
+            "version": "v1.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/helpers.git",
-                "reference": "c28b0ccd799d58564c41a62395ac9511a1e72931"
+                "reference": "4dd0f9436d3911611622a6ced8329a1710576f60"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/helpers/zipball/c28b0ccd799d58564c41a62395ac9511a1e72931",
-                "reference": "c28b0ccd799d58564c41a62395ac9511a1e72931",
+                "url": "https://api.github.com/repos/laravel/helpers/zipball/4dd0f9436d3911611622a6ced8329a1710576f60",
+                "reference": "4dd0f9436d3911611622a6ced8329a1710576f60",
                 "shasum": ""
             },
             "require": {
-                "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0",
+                "illuminate/support": "~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0",
                 "php": "^7.1.3|^8.0"
             },
             "require-dev": {
@@ -1776,9 +1856,9 @@
                 "laravel"
             ],
             "support": {
-                "source": "https://github.com/laravel/helpers/tree/v1.5.0"
+                "source": "https://github.com/laravel/helpers/tree/v1.6.0"
             },
-            "time": "2022-01-12T15:58:51+00:00"
+            "time": "2023-01-09T14:48:11+00:00"
         },
         {
             "name": "laravel/sanctum",
@@ -1847,25 +1927,26 @@
         },
         {
             "name": "laravel/serializable-closure",
-            "version": "v1.2.0",
+            "version": "v1.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/serializable-closure.git",
-                "reference": "09f0e9fb61829f628205b7c94906c28740ff9540"
+                "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae"
             },
             "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/47afb7fae28ed29057fdca37e16a84f90cc62fae",
+                "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae",
                 "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": {
@@ -1902,26 +1983,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": "2022-09-08T13:45:54+00:00"
         },
         {
             "name": "laravel/tinker",
-            "version": "v2.7.2",
+            "version": "v2.8.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/tinker.git",
-                "reference": "dff39b661e827dae6e092412f976658df82dbac5"
+                "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5",
-                "reference": "dff39b661e827dae6e092412f976658df82dbac5",
+                "url": "https://api.github.com/repos/laravel/tinker/zipball/74d0b287cc4ae65d15c368dd697aae71d62a73ad",
+                "reference": "74d0b287cc4ae65d15c368dd697aae71d62a73ad",
                 "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"
@@ -1931,7 +2012,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": {
@@ -1968,22 +2049,22 @@
             ],
             "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.0"
             },
-            "time": "2022-03-23T12:38:24+00:00"
+            "time": "2023-01-10T18:03:30+00:00"
         },
         {
             "name": "league/commonmark",
-            "version": "2.3.4",
+            "version": "2.3.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git",
-                "reference": "155ec1c95626b16fda0889cf15904d24890a60d5"
+                "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/155ec1c95626b16fda0889cf15904d24890a60d5",
-                "reference": "155ec1c95626b16fda0889cf15904d24890a60d5",
+                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47",
+                "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47",
                 "shasum": ""
             },
             "require": {
@@ -2003,15 +2084,15 @@
                 "erusev/parsedown": "^1.0",
                 "ext-json": "*",
                 "github/gfm": "0.29.0",
-                "michelf/php-markdown": "^1.4",
+                "michelf/php-markdown": "^1.4 || ^2.0",
                 "nyholm/psr7": "^1.5",
-                "phpstan/phpstan": "^0.12.88 || ^1.0.0",
-                "phpunit/phpunit": "^9.5.5",
+                "phpstan/phpstan": "^1.8.2",
+                "phpunit/phpunit": "^9.5.21",
                 "scrutinizer/ocular": "^1.8.1",
-                "symfony/finder": "^5.3",
+                "symfony/finder": "^5.3 | ^6.0",
                 "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
-                "unleashedtech/php-coding-standard": "^3.1",
-                "vimeo/psalm": "^4.7.3"
+                "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"
@@ -2076,20 +2157,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-17T16:25:47+00:00"
+            "time": "2022-12-10T16:02:17+00:00"
         },
         {
             "name": "league/config",
-            "version": "v1.1.1",
+            "version": "v1.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/config.git",
-                "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e"
+                "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
-                "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+                "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+                "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
                 "shasum": ""
             },
             "require": {
@@ -2098,7 +2179,7 @@
                 "php": "^7.4 || ^8.0"
             },
             "require-dev": {
-                "phpstan/phpstan": "^0.12.90",
+                "phpstan/phpstan": "^1.8.2",
                 "phpunit/phpunit": "^9.5.5",
                 "scrutinizer/ocular": "^1.8.1",
                 "unleashedtech/php-coding-standard": "^3.1",
@@ -2158,20 +2239,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2021-08-14T12:15:32+00:00"
+            "time": "2022-12-11T20:36:23+00:00"
         },
         {
             "name": "league/flysystem",
-            "version": "3.2.0",
+            "version": "3.12.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/flysystem.git",
-                "reference": "ed0ecc7f9b5c2f4a9872185846974a808a3b052a"
+                "reference": "b934123c1f11ada6363d057d691e3065fa6d6d49"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/ed0ecc7f9b5c2f4a9872185846974a808a3b052a",
-                "reference": "ed0ecc7f9b5c2f4a9872185846974a808a3b052a",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b934123c1f11ada6363d057d691e3065fa6d6d49",
+                "reference": "b934123c1f11ada6363d057d691e3065fa6d6d49",
                 "shasum": ""
             },
             "require": {
@@ -2182,12 +2263,13 @@
                 "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.0",
-                "aws/aws-sdk-php": "^3.198.1",
+                "async-aws/simple-s3": "^1.1",
+                "aws/aws-sdk-php": "^3.220.0",
                 "composer/semver": "^3.0",
                 "ext-fileinfo": "*",
                 "ext-ftp": "*",
@@ -2195,7 +2277,7 @@
                 "friendsofphp/php-cs-fixer": "^3.5",
                 "google/cloud-storage": "^1.23",
                 "microsoft/azure-storage-blob": "^1.1",
-                "phpseclib/phpseclib": "^2.0",
+                "phpseclib/phpseclib": "^3.0.14",
                 "phpstan/phpstan": "^0.12.26",
                 "phpunit/phpunit": "^9.5.11",
                 "sabre/dav": "^4.3.1"
@@ -2232,11 +2314,11 @@
             ],
             "support": {
                 "issues": "https://github.com/thephpleague/flysystem/issues",
-                "source": "https://github.com/thephpleague/flysystem/tree/3.2.0"
+                "source": "https://github.com/thephpleague/flysystem/tree/3.12.1"
             },
             "funding": [
                 {
-                    "url": "https://offset.earth/frankdejonge",
+                    "url": "https://ecologi.com/frankdejonge",
                     "type": "custom"
                 },
                 {
@@ -2248,7 +2330,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-26T07:26:36+00:00"
+            "time": "2023-01-06T16:34:48+00:00"
         },
         {
             "name": "league/mime-type-detection",
@@ -2410,16 +2492,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.60.0",
+            "version": "2.65.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "00a259ae02b003c563158b54fb6743252b638ea6"
+                "reference": "09acf64155c16dc6f580f36569ae89344e9734a3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/00a259ae02b003c563158b54fb6743252b638ea6",
-                "reference": "00a259ae02b003c563158b54fb6743252b638ea6",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3",
+                "reference": "09acf64155c16dc6f580f36569ae89344e9734a3",
                 "shasum": ""
             },
             "require": {
@@ -2430,7 +2512,7 @@
                 "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.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",
@@ -2508,29 +2590,29 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-27T15:57:48+00:00"
+            "time": "2023-01-06T15:55:01+00:00"
         },
         {
             "name": "nette/schema",
-            "version": "v1.2.2",
+            "version": "v1.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nette/schema.git",
-                "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df"
+                "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df",
-                "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df",
+                "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
+                "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
                 "shasum": ""
             },
             "require": {
                 "nette/utils": "^2.5.7 || ^3.1.5 ||  ^4.0",
-                "php": ">=7.1 <8.2"
+                "php": ">=7.1 <8.3"
             },
             "require-dev": {
                 "nette/tester": "^2.3 || ^2.4",
-                "phpstan/phpstan-nette": "^0.12",
+                "phpstan/phpstan-nette": "^1.0",
                 "tracy/tracy": "^2.7"
             },
             "type": "library",
@@ -2568,26 +2650,26 @@
             ],
             "support": {
                 "issues": "https://github.com/nette/schema/issues",
-                "source": "https://github.com/nette/schema/tree/v1.2.2"
+                "source": "https://github.com/nette/schema/tree/v1.2.3"
             },
-            "time": "2021-10-15T11:40:02+00:00"
+            "time": "2022-10-13T01:24:26+00:00"
         },
         {
             "name": "nette/utils",
-            "version": "v3.2.7",
+            "version": "v3.2.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nette/utils.git",
-                "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99"
+                "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99",
-                "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99",
+                "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368",
+                "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.2 <8.2"
+                "php": ">=7.2 <8.3"
             },
             "conflict": {
                 "nette/di": "<3.0.6"
@@ -2653,22 +2735,22 @@
             ],
             "support": {
                 "issues": "https://github.com/nette/utils/issues",
-                "source": "https://github.com/nette/utils/tree/v3.2.7"
+                "source": "https://github.com/nette/utils/tree/v3.2.8"
             },
-            "time": "2022-01-24T11:29:14+00:00"
+            "time": "2022-09-12T23:36:20+00:00"
         },
         {
             "name": "nikic/php-parser",
-            "version": "v4.14.0",
+            "version": "v4.15.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
+                "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc"
             },
             "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/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
+                "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
                 "shasum": ""
             },
             "require": {
@@ -2709,22 +2791,22 @@
             ],
             "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.15.2"
             },
-            "time": "2022-05-31T20:59:12+00:00"
+            "time": "2022-11-12T15:38:23+00:00"
         },
         {
             "name": "nunomaduro/termwind",
-            "version": "v1.13.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nunomaduro/termwind.git",
-                "reference": "132a24bd3e8c559e7f14fa14ba1b83772a0f97f8"
+                "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/132a24bd3e8c559e7f14fa14ba1b83772a0f97f8",
-                "reference": "132a24bd3e8c559e7f14fa14ba1b83772a0f97f8",
+                "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/594ab862396c16ead000de0c3c38f4a5cbe1938d",
+                "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d",
                 "shasum": ""
             },
             "require": {
@@ -2736,7 +2818,7 @@
                 "ergebnis/phpstan-rules": "^1.0.",
                 "illuminate/console": "^8.0|^9.0",
                 "illuminate/support": "^8.0|^9.0",
-                "laravel/pint": "^0.2.0",
+                "laravel/pint": "^1.0.0",
                 "pestphp/pest": "^1.21.0",
                 "pestphp/pest-plugin-mock": "^1.0",
                 "phpstan/phpstan": "^1.4.6",
@@ -2781,7 +2863,7 @@
             ],
             "support": {
                 "issues": "https://github.com/nunomaduro/termwind/issues",
-                "source": "https://github.com/nunomaduro/termwind/tree/v1.13.0"
+                "source": "https://github.com/nunomaduro/termwind/tree/v1.15.0"
             },
             "funding": [
                 {
@@ -2797,33 +2879,126 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-07-01T15:06:55+00:00"
+            "time": "2022-12-20T19:00:15+00:00"
+        },
+        {
+            "name": "openspout/openspout",
+            "version": "v3.7.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/openspout/openspout.git",
+                "reference": "dfbbd53b5edcd486b45a37f6a04fac33073c70f3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/openspout/openspout/zipball/dfbbd53b5edcd486b45a37f6a04fac33073c70f3",
+                "reference": "dfbbd53b5edcd486b45a37f6a04fac33073c70f3",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-filter": "*",
+                "ext-libxml": "*",
+                "ext-xmlreader": "*",
+                "ext-zip": "*",
+                "php": "~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0"
+            },
+            "require-dev": {
+                "ext-zlib": "*",
+                "friendsofphp/php-cs-fixer": "^3.4",
+                "phpstan/phpstan": "^1.4",
+                "phpstan/phpstan-phpunit": "^1.0",
+                "phpunit/phpunit": "^9.5"
+            },
+            "suggest": {
+                "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)",
+                "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "OpenSpout\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Adrien Loison",
+                    "email": "adrien@box.com"
+                }
+            ],
+            "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way",
+            "homepage": "https://github.com/openspout/openspout",
+            "keywords": [
+                "OOXML",
+                "csv",
+                "excel",
+                "memory",
+                "odf",
+                "ods",
+                "office",
+                "open",
+                "php",
+                "read",
+                "scale",
+                "spreadsheet",
+                "stream",
+                "write",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/openspout/openspout/issues",
+                "source": "https://github.com/openspout/openspout/tree/v3.7.4"
+            },
+            "funding": [
+                {
+                    "url": "https://paypal.me/filippotessarotto",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/Slamdunk",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-03-31T06:15:15+00:00"
         },
         {
             "name": "phpoption/phpoption",
-            "version": "1.8.1",
+            "version": "1.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/schmittjoh/php-option.git",
-                "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15"
+                "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
-                "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
+                "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0 || ^8.0"
+                "php": "^7.2.5 || ^8.0"
             },
             "require-dev": {
-                "bamarni/composer-bin-plugin": "^1.4.1",
-                "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+                "bamarni/composer-bin-plugin": "^1.8",
+                "phpunit/phpunit": "^8.5.28 || ^9.5.21"
             },
             "type": "library",
             "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": true
+                },
                 "branch-alias": {
-                    "dev-master": "1.8-dev"
+                    "dev-master": "1.9-dev"
                 }
             },
             "autoload": {
@@ -2856,7 +3031,7 @@
             ],
             "support": {
                 "issues": "https://github.com/schmittjoh/php-option/issues",
-                "source": "https://github.com/schmittjoh/php-option/tree/1.8.1"
+                "source": "https://github.com/schmittjoh/php-option/tree/1.9.0"
             },
             "funding": [
                 {
@@ -2868,7 +3043,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-04T23:24:31+00:00"
+            "time": "2022-07-30T15:51:26+00:00"
         },
         {
             "name": "psr/cache",
@@ -3285,16 +3460,16 @@
         },
         {
             "name": "psy/psysh",
-            "version": "v0.11.7",
+            "version": "v0.11.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/bobthecow/psysh.git",
-                "reference": "77fc7270031fbc28f9a7bea31385da5c4855cb7a"
+                "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/77fc7270031fbc28f9a7bea31385da5c4855cb7a",
-                "reference": "77fc7270031fbc28f9a7bea31385da5c4855cb7a",
+                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9eadffbed9c9deb5426fd107faae0452bf20a36",
+                "reference": "e9eadffbed9c9deb5426fd107faae0452bf20a36",
                 "shasum": ""
             },
             "require": {
@@ -3355,9 +3530,9 @@
             ],
             "support": {
                 "issues": "https://github.com/bobthecow/psysh/issues",
-                "source": "https://github.com/bobthecow/psysh/tree/v0.11.7"
+                "source": "https://github.com/bobthecow/psysh/tree/v0.11.10"
             },
-            "time": "2022-07-07T13:49:11+00:00"
+            "time": "2022-12-23T17:47:18+00:00"
         },
         {
             "name": "ralouphie/getallheaders",
@@ -3405,42 +3580,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/"
@@ -3468,7 +3653,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": [
                 {
@@ -3480,28 +3665,27 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-10-10T03:01:02+00:00"
+            "time": "2022-12-31T21:50:55+00:00"
         },
         {
             "name": "ramsey/uuid",
-            "version": "4.3.1",
+            "version": "4.7.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ramsey/uuid.git",
-                "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28"
+                "reference": "433b2014e3979047db08a17a205f410ba3869cf2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ramsey/uuid/zipball/8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
-                "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2",
+                "reference": "433b2014e3979047db08a17a205f410ba3869cf2",
                 "shasum": ""
             },
             "require": {
-                "brick/math": "^0.8 || ^0.9",
-                "ext-ctype": "*",
+                "brick/math": "^0.8.8 || ^0.9 || ^0.10",
                 "ext-json": "*",
                 "php": "^8.0",
-                "ramsey/collection": "^1.0"
+                "ramsey/collection": "^1.2 || ^2.0"
             },
             "replace": {
                 "rhumsaa/uuid": "self.version"
@@ -3513,24 +3697,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",
@@ -3562,7 +3745,7 @@
             ],
             "support": {
                 "issues": "https://github.com/ramsey/uuid/issues",
-                "source": "https://github.com/ramsey/uuid/tree/4.3.1"
+                "source": "https://github.com/ramsey/uuid/tree/4.7.3"
             },
             "funding": [
                 {
@@ -3574,20 +3757,81 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-27T21:42:02+00:00"
+            "time": "2023-01-12T18:13:24+00:00"
+        },
+        {
+            "name": "spatie/simple-excel",
+            "version": "2.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/spatie/simple-excel.git",
+                "reference": "ebcc81b71022da2bc2350695106976c033a27348"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/spatie/simple-excel/zipball/ebcc81b71022da2bc2350695106976c033a27348",
+                "reference": "ebcc81b71022da2bc2350695106976c033a27348",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/support": "^8.71|^9.0",
+                "openspout/openspout": "^3.0",
+                "php": "^8.0"
+            },
+            "require-dev": {
+                "pestphp/pest-plugin-laravel": "^1.3",
+                "phpunit/phpunit": "^9.4",
+                "spatie/pest-plugin-snapshots": "^1.1",
+                "spatie/phpunit-snapshot-assertions": "^4.0",
+                "spatie/temporary-directory": "^1.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Spatie\\SimpleExcel\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Freek Van der Herten",
+                    "email": "freek@spatie.be",
+                    "homepage": "https://spatie.be",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Read and write simple Excel and CSV files",
+            "homepage": "https://github.com/spatie/simple-excel",
+            "keywords": [
+                "simple-excel",
+                "spatie"
+            ],
+            "support": {
+                "source": "https://github.com/spatie/simple-excel/tree/2.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/spatie",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-12-05T09:48:28+00:00"
         },
         {
             "name": "symfony/console",
-            "version": "v6.1.2",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "7a86c1c42fbcb69b59768504c7bca1d3767760b7"
+                "reference": "0f579613e771dba2dbb8211c382342a641f5da06"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/7a86c1c42fbcb69b59768504c7bca1d3767760b7",
-                "reference": "7a86c1c42fbcb69b59768504c7bca1d3767760b7",
+                "url": "https://api.github.com/repos/symfony/console/zipball/0f579613e771dba2dbb8211c382342a641f5da06",
+                "reference": "0f579613e771dba2dbb8211c382342a641f5da06",
                 "shasum": ""
             },
             "require": {
@@ -3654,7 +3898,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v6.1.2"
+                "source": "https://github.com/symfony/console/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -3670,20 +3914,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-26T13:01:30+00:00"
+            "time": "2022-12-28T14:26:22+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v6.1.0",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "05c40f02f621609404b8820ff8bc39acb46e19cf"
+                "reference": "ab1df4ba3ded7b724766ba3a6e0eca0418e74f80"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/05c40f02f621609404b8820ff8bc39acb46e19cf",
-                "reference": "05c40f02f621609404b8820ff8bc39acb46e19cf",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab1df4ba3ded7b724766ba3a6e0eca0418e74f80",
+                "reference": "ab1df4ba3ded7b724766ba3a6e0eca0418e74f80",
                 "shasum": ""
             },
             "require": {
@@ -3719,7 +3963,7 @@
             "description": "Converts CSS selectors to XPath expressions",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/css-selector/tree/v6.1.0"
+                "source": "https://github.com/symfony/css-selector/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -3735,20 +3979,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T11:15:52+00:00"
+            "time": "2022-12-28T14:26:22+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v3.1.1",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
+                "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
-                "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+                "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
                 "shasum": ""
             },
             "require": {
@@ -3757,7 +4001,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.1-dev"
+                    "dev-main": "3.3-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -3786,7 +4030,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.1.1"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
             },
             "funding": [
                 {
@@ -3802,20 +4046,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T11:15:52+00:00"
+            "time": "2022-11-25T10:21:52+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v6.1.0",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "d02c662651e5de760bb7d5e94437113309e8f8a0"
+                "reference": "0926124c95d220499e2baf0fb465772af3a4eddb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/d02c662651e5de760bb7d5e94437113309e8f8a0",
-                "reference": "d02c662651e5de760bb7d5e94437113309e8f8a0",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/0926124c95d220499e2baf0fb465772af3a4eddb",
+                "reference": "0926124c95d220499e2baf0fb465772af3a4eddb",
                 "shasum": ""
             },
             "require": {
@@ -3857,7 +4101,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.1.0"
+                "source": "https://github.com/symfony/error-handler/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -3873,20 +4117,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-23T10:32:57+00:00"
+            "time": "2022-12-19T14:33:49+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v6.1.0",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347"
+                "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347",
-                "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3ffeb31139b49bf6ef0bc09d1db95eac053388d1",
+                "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1",
                 "shasum": ""
             },
             "require": {
@@ -3940,7 +4184,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/v6.1.0"
+                "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -3956,20 +4200,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-05T16:51:07+00:00"
+            "time": "2022-12-14T16:11:27+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
-            "version": "v3.1.1",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-                "reference": "02ff5eea2f453731cfbc6bc215e456b781480448"
+                "reference": "0782b0b52a737a05b4383d0df35a474303cabdae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448",
-                "reference": "02ff5eea2f453731cfbc6bc215e456b781480448",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae",
+                "reference": "0782b0b52a737a05b4383d0df35a474303cabdae",
                 "shasum": ""
             },
             "require": {
@@ -3982,7 +4226,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.1-dev"
+                    "dev-main": "3.3-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -4019,7 +4263,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1"
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0"
             },
             "funding": [
                 {
@@ -4035,20 +4279,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T11:15:52+00:00"
+            "time": "2022-11-25T10:21:52+00:00"
         },
         {
             "name": "symfony/finder",
-            "version": "v6.1.0",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "45b8beb69d6eb3b05a65689ebfd4222326773f8f"
+                "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/45b8beb69d6eb3b05a65689ebfd4222326773f8f",
-                "reference": "45b8beb69d6eb3b05a65689ebfd4222326773f8f",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/81eefbddfde282ee33b437ba5e13d7753211ae8e",
+                "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e",
                 "shasum": ""
             },
             "require": {
@@ -4083,7 +4327,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v6.1.0"
+                "source": "https://github.com/symfony/finder/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -4099,20 +4343,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-04-15T08:08:08+00:00"
+            "time": "2022-12-22T17:55:15+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v6.1.2",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "86119d294e51afe4d8e07da96b63332bd1f3f52c"
+                "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/86119d294e51afe4d8e07da96b63332bd1f3f52c",
-                "reference": "86119d294e51afe4d8e07da96b63332bd1f3f52c",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ddf4dd35de1623e7c02013523e6c2137b67b636f",
+                "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f",
                 "shasum": ""
             },
             "require": {
@@ -4120,11 +4364,17 @@
                 "symfony/deprecation-contracts": "^2.1|^3",
                 "symfony/polyfill-mbstring": "~1.1"
             },
+            "conflict": {
+                "symfony/cache": "<6.2"
+            },
             "require-dev": {
                 "predis/predis": "~1.0",
                 "symfony/cache": "^5.4|^6.0",
+                "symfony/dependency-injection": "^5.4|^6.0",
                 "symfony/expression-language": "^5.4|^6.0",
-                "symfony/mime": "^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"
             },
             "suggest": {
                 "symfony/mime": "To use the file extension guesser"
@@ -4155,7 +4405,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.1.2"
+                "source": "https://github.com/symfony/http-foundation/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -4171,25 +4421,26 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-19T13:21:48+00:00"
+            "time": "2022-12-14T16:11:27+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v6.1.2",
+            "version": "v6.2.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "8aaede489900dda61aee208557f63bfa1bca0877"
+                "reference": "74f2e638ec3fa0315443bd85fab7fc8066b77f83"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8aaede489900dda61aee208557f63bfa1bca0877",
-                "reference": "8aaede489900dda61aee208557f63bfa1bca0877",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/74f2e638ec3fa0315443bd85fab7fc8066b77f83",
+                "reference": "74f2e638ec3fa0315443bd85fab7fc8066b77f83",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
                 "psr/log": "^1|^2|^3",
+                "symfony/deprecation-contracts": "^2.1|^3",
                 "symfony/error-handler": "^6.1",
                 "symfony/event-dispatcher": "^5.4|^6.0",
                 "symfony/http-foundation": "^5.4|^6.0",
@@ -4200,7 +4451,7 @@
                 "symfony/cache": "<5.4",
                 "symfony/config": "<6.1",
                 "symfony/console": "<5.4",
-                "symfony/dependency-injection": "<6.1",
+                "symfony/dependency-injection": "<6.2",
                 "symfony/doctrine-bridge": "<5.4",
                 "symfony/form": "<5.4",
                 "symfony/http-client": "<5.4",
@@ -4220,7 +4471,7 @@
                 "symfony/config": "^6.1",
                 "symfony/console": "^5.4|^6.0",
                 "symfony/css-selector": "^5.4|^6.0",
-                "symfony/dependency-injection": "^6.1",
+                "symfony/dependency-injection": "^6.2",
                 "symfony/dom-crawler": "^5.4|^6.0",
                 "symfony/expression-language": "^5.4|^6.0",
                 "symfony/finder": "^5.4|^6.0",
@@ -4265,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.1.2"
+                "source": "https://github.com/symfony/http-kernel/tree/v6.2.4"
             },
             "funding": [
                 {
@@ -4281,20 +4532,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-26T17:06:14+00:00"
+            "time": "2022-12-29T19:05:08+00:00"
         },
         {
             "name": "symfony/mailer",
-            "version": "v6.1.2",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mailer.git",
-                "reference": "8fa150355115ea09238858ae3cfaf249fd1fd5ed"
+                "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mailer/zipball/8fa150355115ea09238858ae3cfaf249fd1fd5ed",
-                "reference": "8fa150355115ea09238858ae3cfaf249fd1fd5ed",
+                "url": "https://api.github.com/repos/symfony/mailer/zipball/b355ad81f1d2987c47dcd3b04d5dce669e1e62e6",
+                "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6",
                 "shasum": ""
             },
             "require": {
@@ -4303,15 +4554,20 @@
                 "psr/event-dispatcher": "^1",
                 "psr/log": "^1|^2|^3",
                 "symfony/event-dispatcher": "^5.4|^6.0",
-                "symfony/mime": "^5.4|^6.0",
+                "symfony/mime": "^6.2",
                 "symfony/service-contracts": "^1.1|^2|^3"
             },
             "conflict": {
-                "symfony/http-kernel": "<5.4"
+                "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-contracts": "^1.1|^2|^3",
-                "symfony/messenger": "^5.4|^6.0"
+                "symfony/messenger": "^6.2",
+                "symfony/twig-bridge": "^6.2"
             },
             "type": "library",
             "autoload": {
@@ -4339,7 +4595,7 @@
             "description": "Helps sending emails",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/mailer/tree/v6.1.2"
+                "source": "https://github.com/symfony/mailer/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -4355,20 +4611,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-19T13:21:48+00:00"
+            "time": "2022-12-14T16:11:27+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v6.1.1",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "56508865dd883dce3c863af11b3e8053adab30d7"
+                "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/56508865dd883dce3c863af11b3e8053adab30d7",
-                "reference": "56508865dd883dce3c863af11b3e8053adab30d7",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/8c98bf40406e791043890a163f6f6599b9cfa1ed",
+                "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed",
                 "shasum": ""
             },
             "require": {
@@ -4380,15 +4636,17 @@
                 "egulias/email-validator": "~3.0.0",
                 "phpdocumentor/reflection-docblock": "<3.2.2",
                 "phpdocumentor/type-resolver": "<1.4.0",
-                "symfony/mailer": "<5.4"
+                "symfony/mailer": "<5.4",
+                "symfony/serializer": "<6.2"
             },
             "require-dev": {
                 "egulias/email-validator": "^2.1.10|^3.1",
+                "league/html-to-markdown": "^5.0",
                 "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
                 "symfony/dependency-injection": "^5.4|^6.0",
                 "symfony/property-access": "^5.4|^6.0",
                 "symfony/property-info": "^5.4|^6.0",
-                "symfony/serializer": "^5.4|^6.0"
+                "symfony/serializer": "^6.2"
             },
             "type": "library",
             "autoload": {
@@ -4420,7 +4678,7 @@
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v6.1.1"
+                "source": "https://github.com/symfony/mime/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -4436,20 +4694,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-09T12:51:38+00:00"
+            "time": "2022-12-14T16:38:10+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": {
@@ -4464,7 +4722,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4502,7 +4760,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": [
                 {
@@ -4518,20 +4776,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": {
@@ -4543,7 +4801,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4583,7 +4841,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": [
                 {
@@ -4599,20 +4857,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": {
@@ -4626,7 +4884,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4670,7 +4928,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": [
                 {
@@ -4686,20 +4944,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": {
@@ -4711,7 +4969,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4754,7 +5012,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": [
                 {
@@ -4770,20 +5028,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": {
@@ -4798,7 +5056,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4837,7 +5095,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": [
                 {
@@ -4853,20 +5111,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": {
@@ -4875,7 +5133,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4913,7 +5171,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": [
                 {
@@ -4929,20 +5187,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": {
@@ -4951,7 +5209,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -4996,7 +5254,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": [
                 {
@@ -5012,29 +5270,35 @@
                     "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",
+            "name": "symfony/polyfill-uuid",
+            "version": "v1.27.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/polyfill-php81.git",
-                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+                "url": "https://github.com/symfony/polyfill-uuid.git",
+                "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
-                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+                "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.26-dev"
+                    "dev-main": "1.27-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -5046,11 +5310,8 @@
                     "bootstrap.php"
                 ],
                 "psr-4": {
-                    "Symfony\\Polyfill\\Php81\\": ""
-                },
-                "classmap": [
-                    "Resources/stubs"
-                ]
+                    "Symfony\\Polyfill\\Uuid\\": ""
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -5058,24 +5319,24 @@
             ],
             "authors": [
                 {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
+                    "name": "Grégoire Pineau",
+                    "email": "lyrixx@lyrixx.info"
                 },
                 {
                     "name": "Symfony Community",
                     "homepage": "https://symfony.com/contributors"
                 }
             ],
-            "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+            "description": "Symfony polyfill for uuid functions",
             "homepage": "https://symfony.com",
             "keywords": [
                 "compatibility",
                 "polyfill",
                 "portable",
-                "shim"
+                "uuid"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
+                "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0"
             },
             "funding": [
                 {
@@ -5091,20 +5352,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-24T11:49:31+00:00"
+            "time": "2022-11-03T14:55:06+00:00"
         },
         {
             "name": "symfony/process",
-            "version": "v6.1.0",
+            "version": "v6.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "318718453c2be58266f1a9e74063d13cb8dd4165"
+                "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/318718453c2be58266f1a9e74063d13cb8dd4165",
-                "reference": "318718453c2be58266f1a9e74063d13cb8dd4165",
+                "url": "https://api.github.com/repos/symfony/process/zipball/ba6e55359f8f755fe996c58a81e00eaa67a35877",
+                "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877",
                 "shasum": ""
             },
             "require": {
@@ -5136,7 +5397,7 @@
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v6.1.0"
+                "source": "https://github.com/symfony/process/tree/v6.2.0"
             },
             "funding": [
                 {
@@ -5152,20 +5413,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-11T12:12:29+00:00"
+            "time": "2022-11-02T09:08:04+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v6.1.1",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "8f068b792e515b25e26855ac8dc7fe800399f3e5"
+                "reference": "35fec764f3e2c8c08fb340d275c84bc78ca7e0c9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/8f068b792e515b25e26855ac8dc7fe800399f3e5",
-                "reference": "8f068b792e515b25e26855ac8dc7fe800399f3e5",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/35fec764f3e2c8c08fb340d275c84bc78ca7e0c9",
+                "reference": "35fec764f3e2c8c08fb340d275c84bc78ca7e0c9",
                 "shasum": ""
             },
             "require": {
@@ -5173,14 +5434,14 @@
             },
             "conflict": {
                 "doctrine/annotations": "<1.12",
-                "symfony/config": "<5.4",
+                "symfony/config": "<6.2",
                 "symfony/dependency-injection": "<5.4",
                 "symfony/yaml": "<5.4"
             },
             "require-dev": {
-                "doctrine/annotations": "^1.12",
+                "doctrine/annotations": "^1.12|^2",
                 "psr/log": "^1|^2|^3",
-                "symfony/config": "^5.4|^6.0",
+                "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",
@@ -5224,7 +5485,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v6.1.1"
+                "source": "https://github.com/symfony/routing/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -5240,20 +5501,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-08T12:21:15+00:00"
+            "time": "2022-12-20T16:41:15+00:00"
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v3.1.1",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239"
+                "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239",
-                "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+                "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75",
                 "shasum": ""
             },
             "require": {
@@ -5269,7 +5530,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.1-dev"
+                    "dev-main": "3.3-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -5309,7 +5570,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v3.1.1"
+                "source": "https://github.com/symfony/service-contracts/tree/v3.2.0"
             },
             "funding": [
                 {
@@ -5325,20 +5586,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-30T19:18:58+00:00"
+            "time": "2022-11-25T10:21:52+00:00"
         },
         {
             "name": "symfony/string",
-            "version": "v6.1.2",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "1903f2879875280c5af944625e8246d81c2f0604"
+                "reference": "863219fd713fa41cbcd285a79723f94672faff4d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/1903f2879875280c5af944625e8246d81c2f0604",
-                "reference": "1903f2879875280c5af944625e8246d81c2f0604",
+                "url": "https://api.github.com/repos/symfony/string/zipball/863219fd713fa41cbcd285a79723f94672faff4d",
+                "reference": "863219fd713fa41cbcd285a79723f94672faff4d",
                 "shasum": ""
             },
             "require": {
@@ -5354,6 +5615,7 @@
             "require-dev": {
                 "symfony/error-handler": "^5.4|^6.0",
                 "symfony/http-client": "^5.4|^6.0",
+                "symfony/intl": "^6.2",
                 "symfony/translation-contracts": "^2.0|^3.0",
                 "symfony/var-exporter": "^5.4|^6.0"
             },
@@ -5394,7 +5656,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v6.1.2"
+                "source": "https://github.com/symfony/string/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -5410,20 +5672,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-26T16:35:04+00:00"
+            "time": "2022-12-14T16:11:27+00:00"
         },
         {
             "name": "symfony/translation",
-            "version": "v6.1.0",
+            "version": "v6.2.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "b254416631615bc6fe49b0a67f18658827288147"
+                "reference": "a2a15404ef4c15d92c205718eb828b225a144379"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/b254416631615bc6fe49b0a67f18658827288147",
-                "reference": "b254416631615bc6fe49b0a67f18658827288147",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/a2a15404ef4c15d92c205718eb828b225a144379",
+                "reference": "a2a15404ef4c15d92c205718eb828b225a144379",
                 "shasum": ""
             },
             "require": {
@@ -5443,6 +5705,7 @@
                 "symfony/translation-implementation": "2.3|3.0"
             },
             "require-dev": {
+                "nikic/php-parser": "^4.13",
                 "psr/log": "^1|^2|^3",
                 "symfony/config": "^5.4|^6.0",
                 "symfony/console": "^5.4|^6.0",
@@ -5457,6 +5720,7 @@
                 "symfony/yaml": "^5.4|^6.0"
             },
             "suggest": {
+                "nikic/php-parser": "To use PhpAstExtractor",
                 "psr/log-implementation": "To use logging capability in translator",
                 "symfony/config": "",
                 "symfony/yaml": ""
@@ -5490,7 +5754,7 @@
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v6.1.0"
+                "source": "https://github.com/symfony/translation/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -5506,20 +5770,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-11T12:12:29+00:00"
+            "time": "2022-12-23T14:11:11+00:00"
         },
         {
             "name": "symfony/translation-contracts",
-            "version": "v3.1.1",
+            "version": "v3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation-contracts.git",
-                "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc"
+                "reference": "68cce71402305a015f8c1589bfada1280dc64fe7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc",
-                "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7",
+                "reference": "68cce71402305a015f8c1589bfada1280dc64fe7",
                 "shasum": ""
             },
             "require": {
@@ -5531,7 +5795,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.1-dev"
+                    "dev-main": "3.3-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -5571,7 +5835,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1"
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0"
             },
             "funding": [
                 {
@@ -5587,50 +5851,124 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-27T17:24:16+00:00"
+            "time": "2022-11-25T10:21:52+00:00"
         },
         {
-            "name": "symfony/var-dumper",
-            "version": "v6.1.0",
+            "name": "symfony/uid",
+            "version": "v6.2.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "98587d939cb783aa04e828e8fa857edaca24c212"
+                "url": "https://github.com/symfony/uid.git",
+                "reference": "4f9f537e57261519808a7ce1d941490736522bbc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/98587d939cb783aa04e828e8fa857edaca24c212",
-                "reference": "98587d939cb783aa04e828e8fa857edaca24c212",
+                "url": "https://api.github.com/repos/symfony/uid/zipball/4f9f537e57261519808a7ce1d941490736522bbc",
+                "reference": "4f9f537e57261519808a7ce1d941490736522bbc",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/polyfill-mbstring": "~1.0"
-            },
-            "conflict": {
-                "phpunit/phpunit": "<5.4.3",
-                "symfony/console": "<5.4"
+                "symfony/polyfill-uuid": "^1.15"
             },
             "require-dev": {
-                "ext-iconv": "*",
-                "symfony/console": "^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"
+                "symfony/console": "^5.4|^6.0"
             },
-            "bin": [
-                "Resources/bin/var-dump-server"
-            ],
             "type": "library",
             "autoload": {
-                "files": [
-                    "Resources/functions/dump.php"
-                ],
+                "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.2.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-10-09T08:55:40+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v6.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "fdbadd4803bc3c96ef89238c9c9e2ebe424ec2e0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/fdbadd4803bc3c96ef89238c9c9e2ebe424ec2e0",
+                "reference": "fdbadd4803bc3c96ef89238c9c9e2ebe424ec2e0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<5.4.3",
+                "symfony/console": "<5.4"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "symfony/console": "^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"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
                 "psr-4": {
                     "Symfony\\Component\\VarDumper\\": ""
                 },
@@ -5659,7 +5997,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v6.1.0"
+                "source": "https://github.com/symfony/var-dumper/tree/v6.2.3"
             },
             "funding": [
                 {
@@ -5675,20 +6013,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-21T13:34:40+00:00"
+            "time": "2022-12-22T17:55:15+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": {
@@ -5726,22 +6064,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": {
@@ -5756,15 +6094,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": {
@@ -5796,7 +6138,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": [
                 {
@@ -5808,7 +6150,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2021-12-12T23:22:04+00:00"
+            "time": "2022-10-16T01:01:54+00:00"
         },
         {
             "name": "voku/portable-ascii",
@@ -5945,41 +6287,59 @@
     ],
     "packages-dev": [
         {
-            "name": "composer/class-map-generator",
-            "version": "1.0.0",
+            "name": "barryvdh/laravel-ide-helper",
+            "version": "v2.12.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/composer/class-map-generator.git",
-                "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513"
+                "url": "https://github.com/barryvdh/laravel-ide-helper.git",
+                "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513",
-                "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513",
+                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3ba1e2573b38f72107b8aacc4ee177fcab30a550",
+                "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550",
                 "shasum": ""
             },
             "require": {
-                "composer/pcre": "^2 || ^3",
-                "php": "^7.2 || ^8.0",
-                "symfony/finder": "^4.4 || ^5.3 || ^6"
+                "barryvdh/reflection-docblock": "^2.0.6",
+                "composer/pcre": "^1 || ^2 || ^3",
+                "doctrine/dbal": "^2.6 || ^3",
+                "ext-json": "*",
+                "illuminate/console": "^8 || ^9",
+                "illuminate/filesystem": "^8 || ^9",
+                "illuminate/support": "^8 || ^9",
+                "nikic/php-parser": "^4.7",
+                "php": "^7.3 || ^8.0",
+                "phpdocumentor/type-resolver": "^1.1.0"
             },
             "require-dev": {
-                "phpstan/phpstan": "^1.6",
-                "phpstan/phpstan-deprecation-rules": "^1",
-                "phpstan/phpstan-phpunit": "^1",
-                "phpstan/phpstan-strict-rules": "^1.1",
-                "symfony/filesystem": "^5.4 || ^6",
-                "symfony/phpunit-bridge": "^5"
+                "ext-pdo_sqlite": "*",
+                "friendsofphp/php-cs-fixer": "^2",
+                "illuminate/config": "^8 || ^9",
+                "illuminate/view": "^8 || ^9",
+                "mockery/mockery": "^1.4",
+                "orchestra/testbench": "^6 || ^7",
+                "phpunit/phpunit": "^8.5 || ^9",
+                "spatie/phpunit-snapshot-assertions": "^3 || ^4",
+                "vimeo/psalm": "^3.12"
+            },
+            "suggest": {
+                "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9)."
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.x-dev"
+                    "dev-master": "2.12-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
+                    ]
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Composer\\ClassMapGenerator\\": "src"
+                    "Barryvdh\\LaravelIdeHelper\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -5988,47 +6348,102 @@
             ],
             "authors": [
                 {
-                    "name": "Jordi Boggiano",
-                    "email": "j.boggiano@seld.be",
-                    "homepage": "https://seld.be"
+                    "name": "Barry vd. Heuvel",
+                    "email": "barryvdh@gmail.com"
                 }
             ],
-            "description": "Utilities to scan PHP code and generate class maps.",
+            "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.",
             "keywords": [
-                "classmap"
+                "autocomplete",
+                "codeintel",
+                "helper",
+                "ide",
+                "laravel",
+                "netbeans",
+                "phpdoc",
+                "phpstorm",
+                "sublime"
             ],
             "support": {
-                "issues": "https://github.com/composer/class-map-generator/issues",
-                "source": "https://github.com/composer/class-map-generator/tree/1.0.0"
+                "issues": "https://github.com/barryvdh/laravel-ide-helper/issues",
+                "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.3"
             },
             "funding": [
                 {
-                    "url": "https://packagist.com",
+                    "url": "https://fruitcake.nl",
                     "type": "custom"
                 },
                 {
-                    "url": "https://github.com/composer",
+                    "url": "https://github.com/barryvdh",
                     "type": "github"
-                },
+                }
+            ],
+            "time": "2022-03-06T14:33:42+00:00"
+        },
+        {
+            "name": "barryvdh/reflection-docblock",
+            "version": "v2.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/barryvdh/ReflectionDocBlock.git",
+                "reference": "bf44b757feb8ba1734659029357646466ded673e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/bf44b757feb8ba1734659029357646466ded673e",
+                "reference": "bf44b757feb8ba1734659029357646466ded673e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5.14|^9"
+            },
+            "suggest": {
+                "dflydev/markdown": "~1.0",
+                "erusev/parsedown": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Barryvdh": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
-                    "type": "tidelift"
+                    "name": "Mike van Riel",
+                    "email": "mike.vanriel@naenius.com"
                 }
             ],
-            "time": "2022-06-19T11:31:27+00:00"
+            "support": {
+                "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.0"
+            },
+            "time": "2022-10-31T15:35:43+00:00"
         },
         {
             "name": "composer/pcre",
-            "version": "3.0.0",
+            "version": "3.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/pcre.git",
-                "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd"
+                "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd",
-                "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd",
+                "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
+                "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
                 "shasum": ""
             },
             "require": {
@@ -6070,7 +6485,7 @@
             ],
             "support": {
                 "issues": "https://github.com/composer/pcre/issues",
-                "source": "https://github.com/composer/pcre/tree/3.0.0"
+                "source": "https://github.com/composer/pcre/tree/3.1.0"
             },
             "funding": [
                 {
@@ -6086,7 +6501,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T20:21:48+00:00"
+            "time": "2022-11-17T09:50:14+00:00"
         },
         {
             "name": "composer/semver",
@@ -6237,32 +6652,35 @@
         },
         {
             "name": "doctrine/annotations",
-            "version": "1.13.3",
+            "version": "1.14.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/annotations.git",
-                "reference": "648b0343343565c4a056bfc8392201385e8d89f0"
+                "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0",
-                "reference": "648b0343343565c4a056bfc8392201385e8d89f0",
+                "url": "https://api.github.com/repos/doctrine/annotations/zipball/ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
+                "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
                 "shasum": ""
             },
             "require": {
-                "doctrine/lexer": "1.*",
+                "doctrine/lexer": "^1 || ^2",
                 "ext-tokenizer": "*",
                 "php": "^7.1 || ^8.0",
                 "psr/cache": "^1 || ^2 || ^3"
             },
             "require-dev": {
                 "doctrine/cache": "^1.11 || ^2.0",
-                "doctrine/coding-standard": "^6.0 || ^8.1",
-                "phpstan/phpstan": "^1.4.10 || ^1.8.0",
-                "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
-                "symfony/cache": "^4.4 || ^5.2",
+                "doctrine/coding-standard": "^9 || ^10",
+                "phpstan/phpstan": "~1.4.10 || ^1.8.0",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "symfony/cache": "^4.4 || ^5.4 || ^6",
                 "vimeo/psalm": "^4.10"
             },
+            "suggest": {
+                "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+            },
             "type": "library",
             "autoload": {
                 "psr-4": {
@@ -6304,36 +6722,36 @@
             ],
             "support": {
                 "issues": "https://github.com/doctrine/annotations/issues",
-                "source": "https://github.com/doctrine/annotations/tree/1.13.3"
+                "source": "https://github.com/doctrine/annotations/tree/1.14.2"
             },
-            "time": "2022-07-02T10:48:51+00:00"
+            "time": "2022-12-15T06:48:22+00:00"
         },
         {
             "name": "doctrine/instantiator",
-            "version": "1.4.1",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/instantiator.git",
-                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
+                "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
-                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+                "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1 || ^8.0"
+                "php": "^8.1"
             },
             "require-dev": {
-                "doctrine/coding-standard": "^9",
+                "doctrine/coding-standard": "^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"
+                "phpbench/phpbench": "^1.2",
+                "phpstan/phpstan": "^1.9.4",
+                "phpstan/phpstan-phpunit": "^1.3",
+                "phpunit/phpunit": "^9.5.27",
+                "vimeo/psalm": "^5.4"
             },
             "type": "library",
             "autoload": {
@@ -6360,7 +6778,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/2.0.0"
             },
             "funding": [
                 {
@@ -6376,140 +6794,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-03-03T08:28:38+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"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Freek Van der Herten",
-                    "email": "freek@spatie.be",
-                    "homepage": "https://flareapp.io",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Solution contracts for Ignition",
-            "homepage": "https://github.com/facade/ignition-contracts",
-            "keywords": [
-                "contracts",
-                "flare",
-                "ignition"
-            ],
-            "support": {
-                "issues": "https://github.com/facade/ignition-contracts/issues",
-                "source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
-            },
-            "time": "2020-10-16T08:27:54+00:00"
-        },
-        {
-            "name": "fakerphp/faker",
-            "version": "v1.20.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/FakerPHP/Faker.git",
-                "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b",
-                "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1 || ^8.0",
-                "psr/container": "^1.0 || ^2.0",
-                "symfony/deprecation-contracts": "^2.2 || ^3.0"
-            },
-            "conflict": {
-                "fzaninotto/faker": "*"
-            },
-            "require-dev": {
-                "bamarni/composer-bin-plugin": "^1.4.1",
-                "doctrine/persistence": "^1.3 || ^2.0",
-                "ext-intl": "*",
-                "symfony/phpunit-bridge": "^4.4 || ^5.2"
-            },
-            "suggest": {
-                "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-main": "v1.20-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/FakerPHP/Faker/issues",
-                "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0"
-            },
-            "time": "2022-07-20T13:12:54+00:00"
+            "time": "2022-12-30T00:23:10+00:00"
         },
         {
             "name": "filp/whoops",
-            "version": "2.14.5",
+            "version": "2.14.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/filp/whoops.git",
-                "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc"
+                "reference": "f7948baaa0330277c729714910336383286305da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc",
-                "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc",
+                "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da",
+                "reference": "f7948baaa0330277c729714910336383286305da",
                 "shasum": ""
             },
             "require": {
@@ -6559,7 +6857,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.14.6"
             },
             "funding": [
                 {
@@ -6567,20 +6865,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-01-07T12:00:00+00:00"
+            "time": "2022-11-02T16:23:29+00:00"
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.9.5",
+            "version": "v3.13.2",
             "source": {
                 "type": "git",
-                "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
-                "reference": "4465d70ba776806857a1ac2a6f877e582445ff36"
+                "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+                "reference": "3952f08a81bd3b1b15e11c3de0b6bf037faa8496"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/4465d70ba776806857a1ac2a6f877e582445ff36",
-                "reference": "4465d70ba776806857a1ac2a6f877e582445ff36",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3952f08a81bd3b1b15e11c3de0b6bf037faa8496",
+                "reference": "3952f08a81bd3b1b15e11c3de0b6bf037faa8496",
                 "shasum": ""
             },
             "require": {
@@ -6590,7 +6888,7 @@
                 "ext-json": "*",
                 "ext-tokenizer": "*",
                 "php": "^7.4 || ^8.0",
-                "php-cs-fixer/diff": "^2.0",
+                "sebastian/diff": "^4.0",
                 "symfony/console": "^5.4 || ^6.0",
                 "symfony/event-dispatcher": "^5.4 || ^6.0",
                 "symfony/filesystem": "^5.4 || ^6.0",
@@ -6604,7 +6902,7 @@
             },
             "require-dev": {
                 "justinrainbow/json-schema": "^5.2",
-                "keradus/cli-executor": "^1.5",
+                "keradus/cli-executor": "^2.0",
                 "mikey179/vfsstream": "^1.6.10",
                 "php-coveralls/php-coveralls": "^2.5.2",
                 "php-cs-fixer/accessible-object": "^1.1",
@@ -6613,8 +6911,8 @@
                 "phpspec/prophecy": "^1.15",
                 "phpspec/prophecy-phpunit": "^2.0",
                 "phpunit/phpunit": "^9.5",
-                "phpunitgoodpractices/polyfill": "^1.5",
-                "phpunitgoodpractices/traits": "^1.9.1",
+                "phpunitgoodpractices/polyfill": "^1.6",
+                "phpunitgoodpractices/traits": "^1.9.2",
                 "symfony/phpunit-bridge": "^6.0",
                 "symfony/yaml": "^5.4 || ^6.0"
             },
@@ -6647,8 +6945,8 @@
             ],
             "description": "A tool to automatically fix PHP code style",
             "support": {
-                "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
-                "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.5"
+                "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.2"
             },
             "funding": [
                 {
@@ -6656,7 +6954,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-07-22T08:43:51+00:00"
+            "time": "2023-01-02T23:53:50+00:00"
         },
         {
             "name": "hamcrest/hamcrest-php",
@@ -6711,20 +7009,20 @@
         },
         {
             "name": "laravel/homestead",
-            "version": "v13.2.1",
+            "version": "v13.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/homestead.git",
-                "reference": "248df11ae03152cb64a5735c4c70659051a47c29"
+                "reference": "347ef944c5d0774166989d2ef9ec49cc6671484c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/homestead/zipball/248df11ae03152cb64a5735c4c70659051a47c29",
-                "reference": "248df11ae03152cb64a5735c4c70659051a47c29",
+                "url": "https://api.github.com/repos/laravel/homestead/zipball/347ef944c5d0774166989d2ef9ec49cc6671484c",
+                "reference": "347ef944c5d0774166989d2ef9ec49cc6671484c",
                 "shasum": ""
             },
             "require": {
-                "php": "^8.0 || <8.2",
+                "php": "^8.0 || <8.3",
                 "symfony/console": "^5.0 || ^6.0",
                 "symfony/process": "^5.0 || ^6.0",
                 "symfony/yaml": "^5.0 || ^6.0"
@@ -6759,28 +7057,28 @@
             "description": "A virtual machine for web artisans.",
             "support": {
                 "issues": "https://github.com/laravel/homestead/issues",
-                "source": "https://github.com/laravel/homestead/tree/v13.2.1"
+                "source": "https://github.com/laravel/homestead/tree/v13.3.2"
             },
-            "time": "2022-02-02T19:42:25+00:00"
+            "time": "2022-11-06T19:39:52+00:00"
         },
         {
             "name": "laravel/sail",
-            "version": "v1.15.1",
+            "version": "v1.18.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/sail.git",
-                "reference": "2fe64c0b45a3af56cac0af638c8020a8adc860d7"
+                "reference": "77feb38df1cf8700c19487957dfb12087cd696c7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/sail/zipball/2fe64c0b45a3af56cac0af638c8020a8adc860d7",
-                "reference": "2fe64c0b45a3af56cac0af638c8020a8adc860d7",
+                "url": "https://api.github.com/repos/laravel/sail/zipball/77feb38df1cf8700c19487957dfb12087cd696c7",
+                "reference": "77feb38df1cf8700c19487957dfb12087cd696c7",
                 "shasum": ""
             },
             "require": {
-                "illuminate/console": "^8.0|^9.0",
-                "illuminate/contracts": "^8.0|^9.0",
-                "illuminate/support": "^8.0|^9.0",
+                "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": "^7.3|^8.0"
             },
             "bin": [
@@ -6821,20 +7119,20 @@
                 "issues": "https://github.com/laravel/sail/issues",
                 "source": "https://github.com/laravel/sail"
             },
-            "time": "2022-07-21T14:33:56+00:00"
+            "time": "2023-01-10T16:14:21+00:00"
         },
         {
             "name": "mockery/mockery",
-            "version": "1.5.0",
+            "version": "1.5.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/mockery/mockery.git",
-                "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac"
+                "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
-                "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
+                "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e",
+                "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e",
                 "shasum": ""
             },
             "require": {
@@ -6891,9 +7189,9 @@
             ],
             "support": {
                 "issues": "https://github.com/mockery/mockery/issues",
-                "source": "https://github.com/mockery/mockery/tree/1.5.0"
+                "source": "https://github.com/mockery/mockery/tree/1.5.1"
             },
-            "time": "2022-01-20T13:18:17+00:00"
+            "time": "2022-09-07T15:32:08+00:00"
         },
         {
             "name": "myclabs/deep-copy",
@@ -6956,32 +7254,32 @@
         },
         {
             "name": "nunomaduro/collision",
-            "version": "v6.2.1",
+            "version": "v6.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nunomaduro/collision.git",
-                "reference": "5f058f7e39278b701e455b3c82ec5298cf001d89"
+                "reference": "f05978827b9343cba381ca05b8c7deee346b6015"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nunomaduro/collision/zipball/5f058f7e39278b701e455b3c82ec5298cf001d89",
-                "reference": "5f058f7e39278b701e455b3c82ec5298cf001d89",
+                "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f05978827b9343cba381ca05b8c7deee346b6015",
+                "reference": "f05978827b9343cba381ca05b8c7deee346b6015",
                 "shasum": ""
             },
             "require": {
-                "facade/ignition-contracts": "^1.0.2",
                 "filp/whoops": "^2.14.5",
                 "php": "^8.0.0",
                 "symfony/console": "^6.0.2"
             },
             "require-dev": {
                 "brianium/paratest": "^6.4.1",
-                "laravel/framework": "^9.7",
-                "laravel/pint": "^0.2.1",
-                "nunomaduro/larastan": "^1.0.2",
+                "laravel/framework": "^9.26.1",
+                "laravel/pint": "^1.1.1",
+                "nunomaduro/larastan": "^1.0.3",
                 "nunomaduro/mock-final-classes": "^1.1.0",
-                "orchestra/testbench": "^7.3.0",
-                "phpunit/phpunit": "^9.5.11"
+                "orchestra/testbench": "^7.7",
+                "phpunit/phpunit": "^9.5.23",
+                "spatie/ignition": "^1.4.1"
             },
             "type": "library",
             "extra": {
@@ -7040,42 +7338,39 @@
                     "type": "patreon"
                 }
             ],
-            "time": "2022-06-27T16:11:16+00:00"
+            "time": "2023-01-03T12:54:54+00:00"
         },
         {
             "name": "nunomaduro/larastan",
-            "version": "v2.1.12",
+            "version": "2.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nunomaduro/larastan.git",
-                "reference": "65cfc54fa195e509c2e2be119761552017d22a56"
+                "reference": "14f631348ead3e245651606931863b4f218d1f78"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/65cfc54fa195e509c2e2be119761552017d22a56",
-                "reference": "65cfc54fa195e509c2e2be119761552017d22a56",
+                "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/14f631348ead3e245651606931863b4f218d1f78",
+                "reference": "14f631348ead3e245651606931863b4f218d1f78",
                 "shasum": ""
             },
             "require": {
-                "composer/class-map-generator": "^1.0",
-                "composer/pcre": "^3.0",
                 "ext-json": "*",
-                "illuminate/console": "^9",
-                "illuminate/container": "^9",
-                "illuminate/contracts": "^9",
-                "illuminate/database": "^9",
-                "illuminate/http": "^9",
-                "illuminate/pipeline": "^9",
-                "illuminate/support": "^9",
-                "mockery/mockery": "^1.4.4",
+                "illuminate/console": "^9.47.0 || ^10.0.0",
+                "illuminate/container": "^9.47.0 || ^10.0.0",
+                "illuminate/contracts": "^9.47.0 || ^10.0.0",
+                "illuminate/database": "^9.47.0 || ^10.0.0",
+                "illuminate/http": "^9.47.0 || ^10.0.0",
+                "illuminate/pipeline": "^9.47.0 || ^10.0.0",
+                "illuminate/support": "^9.47.0 || ^10.0.0",
                 "php": "^8.0.2",
-                "phpmyadmin/sql-parser": "^5.5",
-                "phpstan/phpstan": "^1.8.1"
+                "phpmyadmin/sql-parser": "^5.6.0",
+                "phpstan/phpstan": "^1.9.8"
             },
             "require-dev": {
-                "nikic/php-parser": "^4.13.2",
-                "orchestra/testbench": "^7.0.0",
-                "phpunit/phpunit": "^9.5.11"
+                "nikic/php-parser": "^4.15.2",
+                "orchestra/testbench": "^7.19.0|^8.0.0",
+                "phpunit/phpunit": "^9.5.27"
             },
             "suggest": {
                 "orchestra/testbench": "Using Larastan for analysing a package needs Testbench"
@@ -7119,7 +7414,7 @@
             ],
             "support": {
                 "issues": "https://github.com/nunomaduro/larastan/issues",
-                "source": "https://github.com/nunomaduro/larastan/tree/v2.1.12"
+                "source": "https://github.com/nunomaduro/larastan/tree/2.4.0"
             },
             "funding": [
                 {
@@ -7139,7 +7434,7 @@
                     "type": "patreon"
                 }
             ],
-            "time": "2022-07-17T15:23:33+00:00"
+            "time": "2023-01-11T11:57:44+00:00"
         },
         {
             "name": "phar-io/manifest",
@@ -7252,58 +7547,6 @@
             },
             "time": "2022-02-21T01:04:05+00:00"
         },
-        {
-            "name": "php-cs-fixer/diff",
-            "version": "v2.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/PHP-CS-Fixer/diff.git",
-                "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3",
-                "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0 || ^8.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0",
-                "symfony/process": "^3.3"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
-                }
-            ],
-            "description": "sebastian/diff v3 backport support for PHP 5.6+",
-            "homepage": "https://github.com/PHP-CS-Fixer",
-            "keywords": [
-                "diff"
-            ],
-            "support": {
-                "issues": "https://github.com/PHP-CS-Fixer/diff/issues",
-                "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2"
-            },
-            "time": "2020-10-14T08:32:19+00:00"
-        },
         {
             "name": "phpdocumentor/reflection-common",
             "version": "2.2.0",
@@ -7357,84 +7600,32 @@
             },
             "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",
+            "version": "1.6.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "77a32518733312af16a44300404e945338981de3"
+                "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
-                "reference": "77a32518733312af16a44300404e945338981de3",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
+                "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.2 || ^8.0",
+                "php": "^7.4 || ^8.0",
                 "phpdocumentor/reflection-common": "^2.0"
             },
             "require-dev": {
                 "ext-tokenizer": "*",
-                "psalm/phar": "^4.8"
+                "phpstan/extension-installer": "^1.1",
+                "phpstan/phpstan": "^1.8",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpunit/phpunit": "^9.5",
+                "rector/rector": "^0.13.9",
+                "vimeo/psalm": "^4.25"
             },
             "type": "library",
             "extra": {
@@ -7460,27 +7651,28 @@
             "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"
+                "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
             },
-            "time": "2022-03-15T21:29:03+00:00"
+            "time": "2022-10-14T12:47:21+00:00"
         },
         {
             "name": "phpmyadmin/sql-parser",
-            "version": "5.5.0",
+            "version": "5.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpmyadmin/sql-parser.git",
-                "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5"
+                "reference": "63f2f77847586864a661ef009ae687dbdda0a9f1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/8ab99cd0007d880f49f5aa1807033dbfa21b1cb5",
-                "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5",
+                "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/63f2f77847586864a661ef009ae687dbdda0a9f1",
+                "reference": "63f2f77847586864a661ef009ae687dbdda0a9f1",
                 "shasum": ""
             },
             "require": {
                 "php": "^7.1 || ^8.0",
-                "symfony/polyfill-mbstring": "^1.3"
+                "symfony/polyfill-mbstring": "^1.3",
+                "symfony/polyfill-php80": "^1.16"
             },
             "conflict": {
                 "phpmyadmin/motranslator": "<3.0"
@@ -7529,93 +7721,38 @@
                 "analysis",
                 "lexer",
                 "parser",
-                "sql"
+                "query linter",
+                "sql",
+                "sql lexer",
+                "sql linter",
+                "sql parser",
+                "sql syntax highlighter",
+                "sql tokenizer"
             ],
             "support": {
                 "issues": "https://github.com/phpmyadmin/sql-parser/issues",
                 "source": "https://github.com/phpmyadmin/sql-parser"
             },
-            "time": "2021-12-09T04:31:52+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"
-                },
+            "funding": [
                 {
-                    "name": "Marcello Duarte",
-                    "email": "marcello.duarte@gmail.com"
+                    "url": "https://www.phpmyadmin.net/donate/",
+                    "type": "other"
                 }
             ],
-            "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"
+            "time": "2023-01-02T05:36:07+00:00"
         },
         {
             "name": "phpstan/phpstan",
-            "version": "1.8.2",
+            "version": "1.9.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpstan/phpstan.git",
-                "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c"
+                "reference": "60f3d68481eef216199eae7a2603cd5fe124d464"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c53312ecc575caf07b0e90dee43883fdf90ca67c",
-                "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/60f3d68481eef216199eae7a2603cd5fe124d464",
+                "reference": "60f3d68481eef216199eae7a2603cd5fe124d464",
                 "shasum": ""
             },
             "require": {
@@ -7639,9 +7776,13 @@
                 "MIT"
             ],
             "description": "PHPStan - PHP Static Analysis Tool",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
             "support": {
                 "issues": "https://github.com/phpstan/phpstan/issues",
-                "source": "https://github.com/phpstan/phpstan/tree/1.8.2"
+                "source": "https://github.com/phpstan/phpstan/tree/1.9.11"
             },
             "funding": [
                 {
@@ -7652,36 +7793,32 @@
                     "url": "https://github.com/phpstan",
                     "type": "github"
                 },
-                {
-                    "url": "https://www.patreon.com/phpstan",
-                    "type": "patreon"
-                },
                 {
                     "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-07-20T09:57:31+00:00"
+            "time": "2023-01-12T14:04:13+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "9.2.15",
+            "version": "9.2.23",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
+                "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c"
             },
             "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/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
+                "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-libxml": "*",
                 "ext-xmlwriter": "*",
-                "nikic/php-parser": "^4.13.0",
+                "nikic/php-parser": "^4.14",
                 "php": ">=7.3",
                 "phpunit/php-file-iterator": "^3.0.3",
                 "phpunit/php-text-template": "^2.0.2",
@@ -7730,7 +7867,7 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23"
             },
             "funding": [
                 {
@@ -7738,7 +7875,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-03-07T09:28:20+00:00"
+            "time": "2022-12-28T12:41:10+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
@@ -7983,20 +8120,20 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "9.5.21",
+            "version": "9.5.28",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1"
+                "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1",
-                "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e",
+                "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e",
                 "shasum": ""
             },
             "require": {
-                "doctrine/instantiator": "^1.3.1",
+                "doctrine/instantiator": "^1.3.1 || ^2",
                 "ext-dom": "*",
                 "ext-json": "*",
                 "ext-libxml": "*",
@@ -8007,7 +8144,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",
@@ -8015,19 +8151,16 @@
                 "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": "*"
@@ -8069,7 +8202,7 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21"
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28"
             },
             "funding": [
                 {
@@ -8079,9 +8212,578 @@
                 {
                     "url": "https://github.com/sebastianbergmann",
                     "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-14T12:32:24+00:00"
+        },
+        {
+            "name": "roave/security-advisories",
+            "version": "dev-latest",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Roave/SecurityAdvisories.git",
+                "reference": "d69f15ccfded11d661206313e0a984ddac14c42c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/d69f15ccfded11d661206313e0a984ddac14c42c",
+                "reference": "d69f15ccfded11d661206313e0a984ddac14c42c",
+                "shasum": ""
+            },
+            "conflict": {
+                "3f/pygmentize": "<1.2",
+                "admidio/admidio": "<4.1.9",
+                "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3",
+                "aheinze/cockpit": "<=2.2.1",
+                "akaunting/akaunting": "<2.1.13",
+                "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53",
+                "alextselegidis/easyappointments": "<=1.4.3",
+                "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1",
+                "amazing/media2click": ">=1,<1.3.3",
+                "amphp/artax": "<1.0.6|>=2,<2.0.6",
+                "amphp/http": "<1.0.1",
+                "amphp/http-client": ">=4,<4.4",
+                "anchorcms/anchor-cms": "<=0.12.7",
+                "andreapollastri/cipi": "<=3.1.15",
+                "apereo/phpcas": "<1.6",
+                "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6",
+                "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2",
+                "arc/web": "<3",
+                "area17/twill": "<1.2.5|>=2,<2.5.3",
+                "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99",
+                "awesome-support/awesome-support": "<=6.0.7",
+                "aws/aws-sdk-php": ">=3,<3.2.1",
+                "backdrop/backdrop": "<=1.23",
+                "badaso/core": "<2.7",
+                "bagisto/bagisto": "<0.1.5",
+                "barrelstrength/sprout-base-email": "<1.2.7",
+                "barrelstrength/sprout-forms": "<3.9",
+                "barryvdh/laravel-translation-manager": "<0.6.2",
+                "barzahlen/barzahlen-php": "<2.0.1",
+                "baserproject/basercms": "<4.7.2",
+                "billz/raspap-webgui": "<=2.6.6",
+                "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3",
+                "bmarshall511/wordpress_zero_spam": "<5.2.13",
+                "bolt/bolt": "<3.7.2",
+                "bolt/core": "<=4.2",
+                "bottelet/flarepoint": "<2.2.1",
+                "brightlocal/phpwhois": "<=4.2.5",
+                "brotkrueml/codehighlight": "<2.7",
+                "brotkrueml/schema": "<1.13.1|>=2,<2.5.1",
+                "brotkrueml/typo3-matomo-integration": "<1.3.2",
+                "buddypress/buddypress": "<7.2.1",
+                "bugsnag/bugsnag-laravel": ">=2,<2.0.2",
+                "bytefury/crater": "<6.0.2",
+                "cachethq/cachet": "<2.5.1",
+                "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4",
+                "cardgate/magento2": "<2.0.33",
+                "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4",
+                "cartalyst/sentry": "<=2.1.6",
+                "catfan/medoo": "<1.7.5",
+                "centreon/centreon": "<22.10-beta.1",
+                "cesnet/simplesamlphp-module-proxystatistics": "<3.1",
+                "codeception/codeception": "<3.1.3|>=4,<4.1.22",
+                "codeigniter/framework": "<=3.0.6",
+                "codeigniter4/framework": "<4.2.11",
+                "codeigniter4/shield": "= 1.0.0-beta",
+                "codiad/codiad": "<=2.8.4",
+                "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5",
+                "concrete5/concrete5": "<=9.1.3|>= 9.0.0RC1, < 9.1.3",
+                "concrete5/core": "<8.5.8|>=9,<9.1",
+                "contao-components/mediaelement": ">=2.14.2,<2.21.1",
+                "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3",
+                "contao/core": ">=2,<3.5.39",
+                "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0",
+                "contao/listing-bundle": ">=4,<4.4.8",
+                "contao/managed-edition": "<=1.5",
+                "craftcms/cms": "<3.7.55.2|>= 4.0.0-RC1, < 4.2.1",
+                "croogo/croogo": "<3.0.7",
+                "cuyz/valinor": "<0.12",
+                "czproject/git-php": "<4.0.3",
+                "darylldoyle/safe-svg": "<1.9.10",
+                "datadog/dd-trace": ">=0.30,<0.30.2",
+                "david-garcia/phpwhois": "<=4.3.1",
+                "dbrisinajumi/d2files": "<1",
+                "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1",
+                "directmailteam/direct-mail": "<5.2.4",
+                "doctrine/annotations": ">=1,<1.2.7",
+                "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2",
+                "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1",
+                "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4",
+                "doctrine/doctrine-bundle": "<1.5.2",
+                "doctrine/doctrine-module": "<=0.7.1",
+                "doctrine/mongodb-odm": ">=1,<1.0.2",
+                "doctrine/mongodb-odm-bundle": ">=2,<3.0.1",
+                "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4",
+                "dolibarr/dolibarr": "<16|>=16.0.1,<16.0.3|= 12.0.5|>= 3.3.beta1, < 13.0.2",
+                "dompdf/dompdf": "<2.0.1",
+                "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3",
+                "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4",
+                "dweeves/magmi": "<=0.7.24",
+                "ecodev/newsletter": "<=4",
+                "ectouch/ectouch": "<=2.7.2",
+                "elefant/cms": "<1.3.13",
+                "elgg/elgg": "<3.3.24|>=4,<4.0.5",
+                "endroid/qr-code-bundle": "<3.4.2",
+                "enshrined/svg-sanitize": "<0.15",
+                "erusev/parsedown": "<1.7.2",
+                "ether/logs": "<3.0.4",
+                "exceedone/exment": "<4.4.3|>=5,<5.0.3",
+                "exceedone/laravel-admin": "= 3.0.0|<2.2.3",
+                "ezsystems/demobundle": ">=5.4,<5.4.6.1",
+                "ezsystems/ez-support-tools": ">=2.2,<2.2.3",
+                "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1",
+                "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1",
+                "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24",
+                "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26",
+                "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1",
+                "ezsystems/ezplatform-graphql": ">=1-rc.1,<1.0.13|>=2-beta.1,<2.3.12",
+                "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.26",
+                "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8",
+                "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7",
+                "ezsystems/ezplatform-user": ">=1,<1.0.1",
+                "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.30",
+                "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1",
+                "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3",
+                "ezsystems/repository-forms": ">=2.3,<2.3.2.1|>=2.5,<2.5.15",
+                "ezyang/htmlpurifier": "<4.1.1",
+                "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2",
+                "facturascripts/facturascripts": "<=2022.8",
+                "feehi/cms": "<=2.1.1",
+                "feehi/feehicms": "<=2.1.1",
+                "fenom/fenom": "<=2.12.1",
+                "filegator/filegator": "<7.8",
+                "firebase/php-jwt": "<2",
+                "flarum/core": "<1.6.3",
+                "flarum/mentions": "<1.6.3",
+                "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15",
+                "flarum/tags": "<=0.1-beta.13",
+                "fluidtypo3/vhs": "<5.1.1",
+                "fof/byobu": ">=0.3-beta.2,<1.1.7",
+                "fof/upload": "<1.2.3",
+                "fooman/tcpdf": "<6.2.22",
+                "forkcms/forkcms": "<5.11.1",
+                "fossar/tcpdf-parser": "<6.2.22",
+                "francoisjacquet/rosariosis": "<10.1",
+                "friendsofsymfony/oauth2-php": "<1.3",
+                "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
+                "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
+                "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
+                "froala/wysiwyg-editor": "<3.2.7",
+                "froxlor/froxlor": "<0.10.39|>=2-beta.0,<2-beta.1",
+                "fuel/core": "<1.8.1",
+                "gaoming13/wechat-php-sdk": "<=1.10.2",
+                "genix/cms": "<=1.1.11",
+                "getgrav/grav": "<1.7.34",
+                "getkirby/cms": "= 3.8.0|<3.5.8.2|>=3.6,<3.6.6.2|>=3.7,<3.7.5.1",
+                "getkirby/panel": "<2.5.14",
+                "getkirby/starterkit": "<=3.7.0.2",
+                "gilacms/gila": "<=1.11.4",
+                "globalpayments/php-sdk": "<2",
+                "google/protobuf": "<3.15",
+                "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
+                "gree/jose": "<=2.2",
+                "gregwar/rst": "<1.0.3",
+                "grumpydictator/firefly-iii": "<5.6.5",
+                "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5",
+                "guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1",
+                "harvesthq/chosen": "<1.8.7",
+                "helloxz/imgurl": "= 2.31|<=2.31",
+                "hillelcoren/invoice-ninja": "<5.3.35",
+                "himiklab/yii2-jqgrid-widget": "<1.0.8",
+                "hjue/justwriting": "<=1",
+                "hov/jobfair": "<1.0.13|>=2,<2.0.2",
+                "hyn/multi-tenant": ">=5.6,<5.7.2",
+                "ibexa/admin-ui": ">=4.2,<4.2.3",
+                "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3",
+                "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3",
+                "ibexa/post-install": "<=1.0.4",
+                "icecoder/icecoder": "<=8.1",
+                "idno/known": "<=1.3.1",
+                "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10",
+                "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4",
+                "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40",
+                "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
+                "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75",
+                "impresscms/impresscms": "<=1.4.3",
+                "in2code/femanager": "<5.5.2|>=6,<6.3.3|>=7,<7.0.1",
+                "in2code/lux": "<17.6.1|>=18,<24.0.2",
+                "innologi/typo3-appointments": "<2.0.6",
+                "intelliants/subrion": "<=4.2.1",
+                "islandora/islandora": ">=2,<2.4.1",
+                "ivankristianto/phpwhois": "<=4.3",
+                "jackalope/jackalope-doctrine-dbal": "<1.7.4",
+                "james-heinrich/getid3": "<1.9.21",
+                "jasig/phpcas": "<1.3.3",
+                "joomla/archive": "<1.1.12|>=2,<2.0.1",
+                "joomla/filesystem": "<1.6.2|>=2,<2.0.1",
+                "joomla/filter": "<1.4.4|>=2,<2.0.1",
+                "joomla/input": ">=2,<2.0.2",
+                "joomla/session": "<1.3.1",
+                "joyqi/hyper-down": "<=2.4.27",
+                "jsdecena/laracom": "<2.0.9",
+                "jsmitty12/phpwhois": "<5.1",
+                "kazist/phpwhois": "<=4.2.6",
+                "kelvinmo/simplexrd": "<3.1.1",
+                "kevinpapst/kimai2": "<1.16.7",
+                "kitodo/presentation": "<3.1.2",
+                "klaviyo/magento2-extension": ">=1,<3",
+                "krayin/laravel-crm": "<1.2.2",
+                "kreait/firebase-php": ">=3.2,<3.8.1",
+                "la-haute-societe/tcpdf": "<6.2.22",
+                "laminas/laminas-diactoros": "<2.11.1",
+                "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1",
+                "laminas/laminas-http": "<2.14.2",
+                "laravel/fortify": "<1.11.1",
+                "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75",
+                "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10",
+                "latte/latte": "<2.10.8",
+                "lavalite/cms": "<=5.8",
+                "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5",
+                "league/commonmark": "<0.18.3",
+                "league/flysystem": "<1.1.4|>=2,<2.1.1",
+                "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3",
+                "librenms/librenms": "<22.10",
+                "limesurvey/limesurvey": "<3.27.19",
+                "livehelperchat/livehelperchat": "<=3.91",
+                "livewire/livewire": ">2.2.4,<2.2.6",
+                "lms/routes": "<2.1.1",
+                "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2",
+                "luyadev/yii-helpers": "<1.2.1",
+                "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3",
+                "magento/magento1ce": "<1.9.4.3",
+                "magento/magento1ee": ">=1,<1.14.4.3",
+                "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2",
+                "marcwillmann/turn": "<0.3.3",
+                "matyhtf/framework": "<3.0.6",
+                "mautic/core": "<4.3|= 2.13.1",
+                "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35",
+                "melisplatform/melis-asset-manager": "<5.0.1",
+                "melisplatform/melis-cms": "<5.0.1",
+                "melisplatform/melis-front": "<5.0.1",
+                "mezzio/mezzio-swoole": "<3.7|>=4,<4.3",
+                "mgallegos/laravel-jqgrid": "<=1.3",
+                "microweber/microweber": "<=1.3.1",
+                "miniorange/miniorange-saml": "<1.4.3",
+                "mittwald/typo3_forum": "<1.2.1",
+                "modx/revolution": "<= 2.8.3-pl|<2.8",
+                "mojo42/jirafeau": "<4.4",
+                "monolog/monolog": ">=1.8,<1.12",
+                "moodle/moodle": "<4.0.5",
+                "mustache/mustache": ">=2,<2.14.1",
+                "namshi/jose": "<2.2",
+                "neoan3-apps/template": "<1.1.1",
+                "neorazorx/facturascripts": "<2022.4",
+                "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+                "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3",
+                "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2",
+                "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+                "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15",
+                "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
+                "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
+                "nilsteampassnet/teampass": "<=2.1.27.36",
+                "notrinos/notrinos-erp": "<=0.7",
+                "noumo/easyii": "<=0.9",
+                "nukeviet/nukeviet": "<4.5.2",
+                "nystudio107/craft-seomatic": "<3.4.12",
+                "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
+                "october/backend": "<1.1.2",
+                "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469",
+                "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12",
+                "october/rain": "<1.0.472|>=1.1,<1.1.2",
+                "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66",
+                "onelogin/php-saml": "<2.10.4",
+                "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
+                "open-web-analytics/open-web-analytics": "<1.7.4",
+                "opencart/opencart": "<=3.0.3.7",
+                "openid/php-openid": "<2.3",
+                "openmage/magento-lts": "<19.4.15|>=20,<20.0.13",
+                "orchid/platform": ">=9,<9.4.4",
+                "oro/commerce": ">=4.1,<5.0.6",
+                "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7",
+                "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8",
+                "packbackbooks/lti-1-3-php-library": "<5",
+                "padraic/humbug_get_contents": "<1.1.2",
+                "pagarme/pagarme-php": ">=0,<3",
+                "pagekit/pagekit": "<=1.0.18",
+                "paragonie/random_compat": "<2",
+                "passbolt/passbolt_api": "<2.11",
+                "paypal/merchant-sdk-php": "<3.12",
+                "pear/archive_tar": "<1.4.14",
+                "pear/crypt_gpg": "<1.6.7",
+                "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1",
+                "personnummer/personnummer": "<3.0.2",
+                "phanan/koel": "<5.1.4",
+                "php-mod/curl": "<2.3.2",
+                "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7",
+                "phpmailer/phpmailer": "<6.5",
+                "phpmussel/phpmussel": ">=1,<1.6",
+                "phpmyadmin/phpmyadmin": "<5.1.3",
+                "phpmyfaq/phpmyfaq": "<=3.1.7",
+                "phpoffice/phpexcel": "<1.8",
+                "phpoffice/phpspreadsheet": "<1.16",
+                "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7",
+                "phpservermon/phpservermon": "<=3.5.2",
+                "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3",
+                "phpwhois/phpwhois": "<=4.2.5",
+                "phpxmlrpc/extras": "<0.6.1",
+                "phpxmlrpc/phpxmlrpc": "<4.9.2",
+                "pimcore/data-hub": "<1.2.4",
+                "pimcore/pimcore": "<10.5.9",
+                "pocketmine/bedrock-protocol": "<8.0.2",
+                "pocketmine/pocketmine-mp": "<4.12.5|>= 4.0.0-BETA5, < 4.4.2",
+                "pressbooks/pressbooks": "<5.18",
+                "prestashop/autoupgrade": ">=4,<4.10.1",
+                "prestashop/blockwishlist": ">=2,<2.1.1",
+                "prestashop/contactform": ">=1.0.1,<4.3",
+                "prestashop/gamification": "<2.3.2",
+                "prestashop/prestashop": "<1.7.8.8",
+                "prestashop/productcomments": "<5.0.2",
+                "prestashop/ps_emailsubscription": "<2.6.1",
+                "prestashop/ps_facetedsearch": "<3.4.1",
+                "prestashop/ps_linklist": "<3.1",
+                "privatebin/privatebin": "<1.4",
+                "processwire/processwire": "<=3.0.200",
+                "propel/propel": ">=2-alpha.1,<=2-alpha.7",
+                "propel/propel1": ">=1,<=1.7.1",
+                "pterodactyl/panel": "<1.7",
+                "ptrofimov/beanstalk_console": "<1.7.14",
+                "pusher/pusher-php-server": "<2.2.1",
+                "pwweb/laravel-core": "<=0.3.6-beta",
+                "pyrocms/pyrocms": "<=3.9.1",
+                "rainlab/debugbar-plugin": "<3.1",
+                "rankmath/seo-by-rank-math": "<=1.0.95",
+                "react/http": ">=0.7,<1.7",
+                "remdex/livehelperchat": "<3.99",
+                "rmccue/requests": ">=1.6,<1.8",
+                "robrichards/xmlseclibs": "<3.0.4",
+                "roots/soil": "<4.1",
+                "rudloff/alltube": "<3.0.3",
+                "s-cart/core": "<6.9",
+                "s-cart/s-cart": "<6.9",
+                "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
+                "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9",
+                "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11",
+                "sensiolabs/connect": "<4.2.3",
+                "serluck/phpwhois": "<=4.2.6",
+                "shopware/core": "<=6.4.9",
+                "shopware/platform": "<=6.4.9",
+                "shopware/production": "<=6.3.5.2",
+                "shopware/shopware": "<=5.7.14",
+                "shopware/storefront": "<=6.4.8.1",
+                "shopxo/shopxo": "<2.2.6",
+                "showdoc/showdoc": "<2.10.4",
+                "silverstripe/admin": ">=1,<1.11.3",
+                "silverstripe/assets": ">=1,<1.11.1",
+                "silverstripe/cms": "<4.11.3",
+                "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1",
+                "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
+                "silverstripe/framework": "<4.11.14",
+                "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|= 4.0.0-alpha1",
+                "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1",
+                "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1",
+                "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4",
+                "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1",
+                "silverstripe/subsites": ">=2,<2.6.1",
+                "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1",
+                "silverstripe/userforms": "<3",
+                "silverstripe/versioned-admin": ">=1,<1.11.1",
+                "simple-updates/phpwhois": "<=1",
+                "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4",
+                "simplesamlphp/simplesamlphp": "<1.18.6",
+                "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1",
+                "simplesamlphp/simplesamlphp-module-openid": "<1",
+                "simplito/elliptic-php": "<1.0.6",
+                "slim/slim": "<2.6",
+                "smarty/smarty": "<3.1.47|>=4,<4.2.1",
+                "snipe/snipe-it": "<=6.0.14|>= 6.0.0-RC-1, <= 6.0.0-RC-5",
+                "socalnick/scn-social-auth": "<1.15.2",
+                "socialiteproviders/steam": "<1.1",
+                "spatie/browsershot": "<3.57.4",
+                "spipu/html2pdf": "<5.2.4",
+                "spoonity/tcpdf": "<6.2.22",
+                "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1",
+                "ssddanbrown/bookstack": "<22.2.3",
+                "statamic/cms": "<3.2.39|>=3.3,<3.3.2",
+                "stormpath/sdk": ">=0,<9.9.99",
+                "studio-42/elfinder": "<2.1.59",
+                "subrion/cms": "<=4.2.1",
+                "sukohi/surpass": "<1",
+                "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8",
+                "sumocoders/framework-user-bundle": "<1.4",
+                "swiftmailer/swiftmailer": ">=4,<5.4.5",
+                "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2",
+                "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+                "sylius/grid-bundle": "<1.10.1",
+                "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1",
+                "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4",
+                "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2",
+                "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99",
+                "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4",
+                "symbiote/silverstripe-seed": "<6.0.3",
+                "symbiote/silverstripe-versionedfiles": "<=2.0.3",
+                "symfont/process": ">=0,<4",
+                "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8",
+                "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4",
+                "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
+                "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14",
+                "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
+                "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12",
+                "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
+                "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1",
+                "symfony/mime": ">=4.3,<4.3.8",
+                "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/polyfill": ">=1,<1.10",
+                "symfony/polyfill-php55": ">=1,<1.10",
+                "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+                "symfony/routing": ">=2,<2.0.19",
+                "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8",
+                "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12",
+                "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9",
+                "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+                "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8",
+                "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2",
+                "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12",
+                "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3",
+                "symfony/translation": ">=2,<2.0.17",
+                "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3",
+                "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
+                "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
+                "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7",
+                "t3/dce": ">=2.2,<2.6.2",
+                "t3g/svg-sanitizer": "<1.0.3",
+                "tastyigniter/tastyigniter": "<3.3",
+                "tecnickcom/tcpdf": "<6.2.22",
+                "terminal42/contao-tablelookupwizard": "<3.3.5",
+                "thelia/backoffice-default-template": ">=2.1,<2.1.2",
+                "thelia/thelia": ">=2.1-beta.1,<2.1.3",
+                "theonedemon/phpwhois": "<=4.2.5",
+                "thinkcmf/thinkcmf": "<=5.1.7",
+                "thorsten/phpmyfaq": "<3.1.9",
+                "tinymce/tinymce": "<5.10.7|>=6,<6.3.1",
+                "titon/framework": ">=0,<9.9.99",
+                "tobiasbg/tablepress": "<= 2.0-RC1",
+                "topthink/framework": "<6.0.14",
+                "topthink/think": "<=6.0.9",
+                "topthink/thinkphp": "<=3.2.3",
+                "tribalsystems/zenario": "<=9.3.57595",
+                "truckersmp/phpwhois": "<=4.3.1",
+                "ttskch/pagination-service-provider": "<1",
+                "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3",
+                "typo3/cms": "<2.0.5|>=3,<3.0.3|>=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1",
+                "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+                "typo3/cms-core": "<8.7.49|>=9,<9.5.38|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1",
+                "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+                "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+                "typo3/html-sanitizer": ">=1,<1.5|>=2,<2.1.1",
+                "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
+                "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
+                "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+                "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10",
+                "ua-parser/uap-php": "<3.8",
+                "unisharp/laravel-filemanager": "<=2.5.1",
+                "userfrosting/userfrosting": ">=0.3.1,<4.6.3",
+                "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
+                "vanilla/safecurl": "<0.9.2",
+                "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4",
+                "vova07/yii2-fileapi-widget": "<0.1.9",
+                "vrana/adminer": "<4.8.1",
+                "wallabag/tcpdf": "<6.2.22",
+                "wanglelecc/laracms": "<=1.0.3",
+                "web-auth/webauthn-framework": ">=3.3,<3.3.4",
+                "webcoast/deferred-image-processing": "<1.0.2",
+                "webpa/webpa": "<3.1.2",
+                "wikimedia/parsoid": "<0.12.2",
+                "willdurand/js-translation-bundle": "<2.1.1",
+                "wintercms/winter": "<1.0.475|>=1.1,<1.1.10|>=1.2,<1.2.1",
+                "woocommerce/woocommerce": "<6.6",
+                "wp-cli/wp-cli": "<2.5",
+                "wp-graphql/wp-graphql": "<0.3.5",
+                "wpanel/wpanel4-cms": "<=4.3.1",
+                "wwbn/avideo": "<=11.6",
+                "xataface/xataface": "<3",
+                "yeswiki/yeswiki": "<4.1",
+                "yetiforce/yetiforce-crm": "<=6.4",
+                "yidashi/yii2cmf": "<=2",
+                "yii2mod/yii2-cms": "<1.9.2",
+                "yiisoft/yii": "<1.1.27",
+                "yiisoft/yii2": "<2.0.38",
+                "yiisoft/yii2-bootstrap": "<2.0.4",
+                "yiisoft/yii2-dev": "<2.0.43",
+                "yiisoft/yii2-elasticsearch": "<2.0.5",
+                "yiisoft/yii2-gii": "<=2.2.4",
+                "yiisoft/yii2-jui": "<2.0.4",
+                "yiisoft/yii2-redis": "<2.0.8",
+                "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6",
+                "yoast-seo-for-typo3/yoast_seo": "<7.2.3",
+                "yourls/yourls": "<=1.8.2",
+                "zendesk/zendesk_api_client_php": "<2.2.11",
+                "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3",
+                "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2",
+                "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2",
+                "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5",
+                "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3",
+                "zendframework/zend-diactoros": "<1.8.4",
+                "zendframework/zend-feed": "<2.10.3",
+                "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-http": "<2.8.1",
+                "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+                "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3",
+                "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2",
+                "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4",
+                "zendframework/zend-validator": ">=2.3,<2.3.6",
+                "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1",
+                "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+                "zendframework/zendframework": "<=3",
+                "zendframework/zendframework1": "<1.12.20",
+                "zendframework/zendopenid": ">=2,<2.0.2",
+                "zendframework/zendxml": ">=1,<1.0.1",
+                "zetacomponents/mail": "<1.8.2",
+                "zf-commons/zfc-user": "<1.2.2",
+                "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3",
+                "zfr/zfr-oauth2-server-module": "<0.1.2",
+                "zoujingli/thinkadmin": "<6.0.22"
+            },
+            "default-branch": true,
+            "type": "metapackage",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "role": "maintainer"
+                },
+                {
+                    "name": "Ilya Tribusean",
+                    "email": "slash3b@gmail.com",
+                    "role": "maintainer"
+                }
+            ],
+            "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
+            "support": {
+                "issues": "https://github.com/Roave/SecurityAdvisories/issues",
+                "source": "https://github.com/Roave/SecurityAdvisories/tree/latest"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Ocramius",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories",
+                    "type": "tidelift"
                 }
             ],
-            "time": "2022-06-19T12:14:25+00:00"
+            "time": "2023-01-14T06:04:34+00:00"
         },
         {
             "name": "sebastian/cli-parser",
@@ -8252,16 +8954,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": {
@@ -8314,7 +9016,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": [
                 {
@@ -8322,7 +9024,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-10-26T15:49:45+00:00"
+            "time": "2022-09-14T12:41:17+00:00"
         },
         {
             "name": "sebastian/complexity",
@@ -8512,16 +9214,16 @@
         },
         {
             "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": {
@@ -8577,7 +9279,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": [
                 {
@@ -8585,7 +9287,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2021-11-11T14:18:36+00:00"
+            "time": "2022-09-14T06:03:37+00:00"
         },
         {
             "name": "sebastian/global-state",
@@ -8940,16 +9642,16 @@
         },
         {
             "name": "sebastian/type",
-            "version": "3.0.0",
+            "version": "3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/type.git",
-                "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
+                "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
-                "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
+                "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
                 "shasum": ""
             },
             "require": {
@@ -8961,7 +9663,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
@@ -8984,7 +9686,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.0"
             },
             "funding": [
                 {
@@ -8992,7 +9694,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-03-15T09:54:48+00:00"
+            "time": "2022-09-12T14:47:03+00:00"
         },
         {
             "name": "sebastian/version",
@@ -9111,16 +9813,16 @@
         },
         {
             "name": "spatie/flare-client-php",
-            "version": "1.2.0",
+            "version": "1.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/flare-client-php.git",
-                "reference": "86a380f5b1ce839af04a08f1c8f2697184cdf23f"
+                "reference": "609903bd154ba3d71f5e23a91c3b431fa8f71868"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/86a380f5b1ce839af04a08f1c8f2697184cdf23f",
-                "reference": "86a380f5b1ce839af04a08f1c8f2697184cdf23f",
+                "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/609903bd154ba3d71f5e23a91c3b431fa8f71868",
+                "reference": "609903bd154ba3d71f5e23a91c3b431fa8f71868",
                 "shasum": ""
             },
             "require": {
@@ -9168,7 +9870,7 @@
             ],
             "support": {
                 "issues": "https://github.com/spatie/flare-client-php/issues",
-                "source": "https://github.com/spatie/flare-client-php/tree/1.2.0"
+                "source": "https://github.com/spatie/flare-client-php/tree/1.3.2"
             },
             "funding": [
                 {
@@ -9176,20 +9878,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-05-16T12:13:39+00:00"
+            "time": "2022-12-26T14:36:46+00:00"
         },
         {
             "name": "spatie/ignition",
-            "version": "1.3.1",
+            "version": "1.4.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/ignition.git",
-                "reference": "997363fbcce809b1e55f571997d49017f9c623d9"
+                "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/ignition/zipball/997363fbcce809b1e55f571997d49017f9c623d9",
-                "reference": "997363fbcce809b1e55f571997d49017f9c623d9",
+                "url": "https://api.github.com/repos/spatie/ignition/zipball/dd3d456779108d7078baf4e43f8c2b937d9794a1",
+                "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1",
                 "shasum": ""
             },
             "require": {
@@ -9251,31 +9953,31 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-05-16T13:16:07+00:00"
+            "time": "2022-08-26T11:51:15+00:00"
         },
         {
             "name": "spatie/laravel-ignition",
-            "version": "1.3.1",
+            "version": "1.6.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/laravel-ignition.git",
-                "reference": "fe37a0eafe6ea040804255c70e9808af13314f87"
+                "reference": "1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/fe37a0eafe6ea040804255c70e9808af13314f87",
-                "reference": "fe37a0eafe6ea040804255c70e9808af13314f87",
+                "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc",
+                "reference": "1a2b4bd3d48c72526c0ba417687e5c56b5cf49bc",
                 "shasum": ""
             },
             "require": {
                 "ext-curl": "*",
                 "ext-json": "*",
                 "ext-mbstring": "*",
-                "illuminate/support": "^8.77|^9.0",
+                "illuminate/support": "^8.77|^9.27",
                 "monolog/monolog": "^2.3",
                 "php": "^8.0",
                 "spatie/flare-client-php": "^1.0.1",
-                "spatie/ignition": "^1.2.4",
+                "spatie/ignition": "^1.4.1",
                 "symfony/console": "^5.0|^6.0",
                 "symfony/var-dumper": "^5.0|^6.0"
             },
@@ -9341,20 +10043,20 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-06-17T06:28:57+00:00"
+            "time": "2023-01-03T19:28:04+00:00"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v6.1.0",
+            "version": "v6.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "3132d2f43ca799c2aa099f9738d98228c56baa5d"
+                "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/3132d2f43ca799c2aa099f9738d98228c56baa5d",
-                "reference": "3132d2f43ca799c2aa099f9738d98228c56baa5d",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/50b2523c874605cf3d4acf7a9e2b30b6a440a016",
+                "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016",
                 "shasum": ""
             },
             "require": {
@@ -9388,7 +10090,7 @@
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v6.1.0"
+                "source": "https://github.com/symfony/filesystem/tree/v6.2.0"
             },
             "funding": [
                 {
@@ -9404,20 +10106,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-05-21T13:34:40+00:00"
+            "time": "2022-11-20T13:01:27+00:00"
         },
         {
             "name": "symfony/options-resolver",
-            "version": "v6.1.0",
+            "version": "v6.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4"
+                "reference": "d28f02acde71ff75e957082cd36e973df395f626"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4",
-                "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d28f02acde71ff75e957082cd36e973df395f626",
+                "reference": "d28f02acde71ff75e957082cd36e973df395f626",
                 "shasum": ""
             },
             "require": {
@@ -9455,7 +10157,86 @@
                 "options"
             ],
             "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v6.1.0"
+                "source": "https://github.com/symfony/options-resolver/tree/v6.2.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-02T09:08:04+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php81",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php81.git",
+                "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a",
+                "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a",
+                "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\\Php81\\": ""
+                },
+                "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 8.1+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0"
             },
             "funding": [
                 {
@@ -9471,20 +10252,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T11:15:52+00:00"
+            "time": "2022-11-03T14:55:06+00:00"
         },
         {
             "name": "symfony/stopwatch",
-            "version": "v6.1.0",
+            "version": "v6.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/stopwatch.git",
-                "reference": "77dedae82ce2a26e2e9b481855473fc3b3e4e54d"
+                "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/77dedae82ce2a26e2e9b481855473fc3b3e4e54d",
-                "reference": "77dedae82ce2a26e2e9b481855473fc3b3e4e54d",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
+                "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
                 "shasum": ""
             },
             "require": {
@@ -9517,7 +10298,7 @@
             "description": "Provides a way to profile code",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/stopwatch/tree/v6.1.0"
+                "source": "https://github.com/symfony/stopwatch/tree/v6.2.0"
             },
             "funding": [
                 {
@@ -9533,20 +10314,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-02-25T11:15:52+00:00"
+            "time": "2022-09-28T16:00:52+00:00"
         },
         {
             "name": "symfony/yaml",
-            "version": "v6.1.2",
+            "version": "v6.2.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "b01c4e7dc6a51cbf114567af04a19789fd1011fe"
+                "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/b01c4e7dc6a51cbf114567af04a19789fd1011fe",
-                "reference": "b01c4e7dc6a51cbf114567af04a19789fd1011fe",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3",
+                "reference": "6ed8243aa5f2cb5a57009f826b5e7fb3c4200cf3",
                 "shasum": ""
             },
             "require": {
@@ -9591,7 +10372,7 @@
             "description": "Loads and dumps YAML files",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/yaml/tree/v6.1.2"
+                "source": "https://github.com/symfony/yaml/tree/v6.2.2"
             },
             "funding": [
                 {
@@ -9607,7 +10388,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-06-20T12:01:07+00:00"
+            "time": "2022-12-14T16:11:27+00:00"
         },
         {
             "name": "theseer/tokenizer",
@@ -9662,7 +10443,9 @@
     ],
     "aliases": [],
     "minimum-stability": "dev",
-    "stability-flags": [],
+    "stability-flags": {
+        "roave/security-advisories": 20
+    },
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
diff --git a/database/migrations/2022_08_22_132023_change_level_0_label.php b/database/migrations/2022_08_22_132023_change_level_0_label.php
new file mode 100644
index 0000000000000000000000000000000000000000..93da4aee3ff03d1dc739a9954dec1afac63b7504
--- /dev/null
+++ b/database/migrations/2022_08_22_132023_change_level_0_label.php
@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        $driver = env('DB_CONNECTION');
+
+        if ('sqlite' === $driver) {
+            DB::table('measures')->update(['level0_actual_label' => DB::raw("`level0_actual_label` || ' ou ne sais pas'")]);
+        } else {
+            DB::table('measures')->update(['level0_actual_label' => DB::raw("CONCAT(`level0_actual_label`, ' ou ne sais pas')")]);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+    }
+};
diff --git a/database/migrations/2022_08_22_142023_change_measure_descriptions.php b/database/migrations/2022_08_22_142023_change_measure_descriptions.php
new file mode 100644
index 0000000000000000000000000000000000000000..c7c5adbb7f36d92671c5d698f669e7a576d12bd3
--- /dev/null
+++ b/database/migrations/2022_08_22_142023_change_measure_descriptions.php
@@ -0,0 +1,87 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::table('measures')->where('short_name', 'AV et outils complémentaires')
+            ->update([
+            'level1_description' => 'La collectivité possède : <ul><li>un antivirus professionnel à jour sur chaque poste</li></ul>',
+            'level2_description' => 'La collectivité possède : <ul><li>un antivirus professionnel (avec module complémentaires filtrage web, anti-hameçonnage, renforcement des transactions) à jour sur chaque poste</li></ul>',
+            'level3_description' => "La collectivité s'assure :  <ul><li>que les alertes sont vérifiées annuellement, </li><li>qu'elle a son propre serveur DNS.</li></ul>",
+        ]);
+        DB::table('measures')->where('short_name', 'Cloisonnement réseaux')
+            ->update([
+                'level1_description' => 'La collectivité possède : <ul><li>un parefeu activé qui bloque les connexions entrantes</li></ul>',
+                'level2_description' => 'La collectivité possède : <ul><li>un Wifi dédié et cloisonné pour les personnes extérieures</li></ul>',
+                'level3_description' => 'La collectivité possède : <ul><li>un réseau dédié et isolé pour les copieurs,</li><li>un accès VPN pour les personnes à distance</li></ul>',
+        ]);
+        DB::table('measures')->where('short_name', 'Contrats')
+            ->update([
+                'level1_description' => 'La collectivité possède : <ul><li>Un inventaire des contrats mis à jour une fois par an</li></ul>',
+                'level2_description' => "La collectivité s'assure : <ul><li>que les contrats les plus sensibles au niveau de la sécurité du système d’information (SSI) sont identifiés.</li></ul>",
+                'level3_description' => "La collectivité s'assure : <ul><li>que les règles de sécurités minimales sont imposées aux prestataires sensibles.</li></ul>",
+        ]);
+        DB::table('measures')->where('short_name', 'Droits d\'accès logiques')
+            ->update([
+                'level1_description' => "La collectivité s'assure : <ul><li>qu'un inventaire des droits d'accès Windows est disponible et mis à jour une fois par an.</li><li>que les comptes de messagerie et des session Windows sont nominatifs.</li></ul>",
+                'level2_description' => "La collectivité s'assure : <ul><li>qu'un inventaire des droits d'accès des applications métiers est disponible et mis à jour une fois par an.</li><li>que le départ des collaborateurs est géré (retrait des droits d’accès).</li></ul>",
+                'level3_description' => "La collectivité s'assure : <ul><li>qu'un contrôle est réalisé une fois par an sur la base des inventaires.</li>",
+            ]);
+        DB::table('measures')->where('short_name', 'MAJ')
+            ->update([
+                'level1_description' => "La collectivité s'assure : <ul><li>que chaque poste est configuré pour que Windows se mette à jour automatiquement et régulièrement.</li><li>que les postes obsolètes sont remplacés.</li></ul>",
+                'level2_description' => 'Chaque poste est configuré pour que les navigateurs et les suites bureautiques se mettent à jour automatiquement et régulièrement',
+                'level3_description' => "La collectivité s'assure : <ul><li>que la bonne mise à jour des postes, des navigateurs et des suites bureautiques est vérifiée au moins une fois par an.</li></ul>",
+                'level3_actual_label' => 'Un contrôle annuel des mises à jour des postes, navigateurs et suites bureautiques est réalisé.',
+                'level1_actual_label' => "Un inventaire des droits d'accès Windows, comptes de messagerie et sessions Windows est disponible",
+                'level1_preconized_label' => "Inventorier les droits d'accès Windows, comptes de messagerie et sessions Windows.",
+            ]);
+        DB::table('measures')->where('short_name', 'Modes dégradés')
+            ->update([
+                'level1_description' => "La collectivité s'assure :<ul><li>de contacter Cybermalveillance, la gendarmerie ou la police et/ou son OPSN en cas d'incidents cyber.</li></ul>",
+                'level2_description' => 'La collectivité possède : <ul><li>un document expliquant comment réagir en cas de ransomware/rançongiciel et affiché pour les agents dans la collectivité</li></ul>',
+                'level3_description' => 'La collectivité possède : <ul><li>des documents sur les opérations nécessaires à la reconstruction de son système d’information (SI).</li></ul>',
+            ]);
+        DB::table('measures')->where('short_name', 'Plan informatique')
+            ->update([
+                'level1_description' => 'La collectivité possède : <ul><li>un inventaire des équipements informatiques mis à jour une fois par an.</li></ul>',
+                'level2_description' => "La collectivité possède : <ul><li>un schéma d'implantation par bâtiment mis à jour une fois par an.</li></ul>",
+                'level3_description' => 'La collectivité possède : <ul><li>un schéma réseau mis à jour une fois par an</li></ul>',
+            ]);
+        DB::table('measures')->where('short_name', 'Mots de passe')
+            ->update([
+                'level1_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe de connexion Windows personnel comprenant 9 caractères (chiffre, minuscule, majuscule, caractères spéciaux).</li></ul>",
+                'level2_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe Windows personnel et de messagerie distinct comprenant 12 caractères (chiffre, minuscule, majuscule, caractères spéciaux) et changement tous les 2 ans.</li></ul>",
+                'level3_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe personnel pour la session Windows avec un compte sans privilèges (utilisateur).</li><li>que le mot de passe de la session doit comprendre au moins 12 caractères (chiffres, minuscules, majuscules, caractères spéciaux) et changement tous les 2 ans.</li></ul>",
+            ]);
+        DB::table('measures')->where('short_name', 'Sauvegardes')
+            ->update([
+                'level1_description' => 'La collectivité possède : <ul><li>Une sauvegarde régulière sur un support externe et une copie réalisée sur un autre support.</li></ul>',
+                'level2_description' => 'La collectivité possède : <ul><li>une sauvegarde manuelle régulière sur deux supports différents. - une des sauvegardes est externalisée.</li></ul>',
+                'level3_description' => "La collectivité s'assure : <ul><li>qu'une fois par an un test de restauration technique est réalisé.</li></ul>",
+            ]);
+        DB::table('measures')->where('short_name', 'Sensibilisation')
+            ->update([
+                'level1_description' => "La collectivité s'assure : <ul><li>que les fiches pratiques Cybermalveillance sont diffusées aux agents et élus de la collectivité.</li></ul>",
+                'level2_description' => "La collectivité s'assure : <ul><li>que les agents et élus suivent régulièrement des événementiels locaux ou nationaux ayant trait à la cybersécurité.</li></ul>",
+                'level3_description' => "La collectivité s'assure : <ul><li>qu'une réunion de sensibilisation annuelle sur les risques du numérique et les bonnes pratiques est organisée avec l’ensemble des agents et des élus.</li></ul>",
+            ]);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+    }
+};
diff --git a/database/migrations/2022_08_23_125132_change_danger_levels_descriptions.php b/database/migrations/2022_08_23_125132_change_danger_levels_descriptions.php
new file mode 100644
index 0000000000000000000000000000000000000000..8913ef571415fb189d12048423a4fa7e78e8d307
--- /dev/null
+++ b/database/migrations/2022_08_23_125132_change_danger_levels_descriptions.php
@@ -0,0 +1,44 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::table('danger_levels')->where('name', 'Négligeable')
+            ->update([
+                'color' => '#468355',
+                'description' => 'La structure sera faiblement impactée, la résolution prendra quelques jours, aucune séquelle ne sera perceptible.',
+            ]);
+        DB::table('danger_levels')->where('name', 'Limité')
+            ->update([
+                'color' => '#FFC107',
+                'description' => 'La structure sera faiblement impactée, la résolution prendra plusieurs semaines, aucune séquelle ne sera perceptible.',
+            ]);
+        DB::table('danger_levels')->where('name', 'Important')
+            ->update([
+                'color' => '#D63F49',
+                'description' => 'La structure sera fortement impactée, la résolution prendra plusieurs semaines, les séquelles seront perceptibles sur plusieurs mois.',
+            ]);
+        DB::table('danger_levels')->where('name', 'Critique')
+            ->update([
+                'color' => '#454545',
+                'description' => 'La structure sera fortement impactée, la résolution prendra plusieurs mois, les séquelles seront perceptibles sur plusieurs années.',
+            ]);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+    }
+};
diff --git a/database/migrations/2022_09_12_131229_replace_danger_scenario_measure_links.php b/database/migrations/2022_09_12_131229_replace_danger_scenario_measure_links.php
new file mode 100644
index 0000000000000000000000000000000000000000..283d076cc3f86d80f6976392497a500a3d824dc8
--- /dev/null
+++ b/database/migrations/2022_09_12_131229_replace_danger_scenario_measure_links.php
@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Support\Facades\Artisan;
+use Illuminate\Support\Facades\DB;
+
+return new class() extends Migration {
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::table('danger_scenario')->delete();
+        DB::table('measure_scenario')->delete();
+
+        Artisan::call('db:seed', [
+            '--class' => 'ScenarioSeeder',
+            '--force' => true,
+        ]);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+    }
+};
diff --git a/database/migrations/2022_10_30_185437_add_lat_lng_to_address_table.php b/database/migrations/2022_10_30_185437_add_lat_lng_to_address_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcd2266b290fb0f91f4f1bfdff72a8e264a079ba
--- /dev/null
+++ b/database/migrations/2022_10_30_185437_add_lat_lng_to_address_table.php
@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class() extends Migration {
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('address', function (Blueprint $table) {
+            $table->string('lat')->nullable();
+            $table->string('lng')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('address', function (Blueprint $table) {
+            $table->dropColumn(['lat', 'lng']);
+        });
+    }
+};
diff --git a/database/seeders/DangerLevelSeeder.php b/database/seeders/DangerLevelSeeder.php
index 1e6cb12ce2049b005401eed3a180119d14bcdf67..1e643e7c2b409c295b6b8cfd8b42745438b33b17 100644
--- a/database/seeders/DangerLevelSeeder.php
+++ b/database/seeders/DangerLevelSeeder.php
@@ -14,9 +14,29 @@ class DangerLevelSeeder extends Seeder
      */
     public function run()
     {
-        DangerLevel::factory()->create(['name' => 'Critique', 'value' => 100, 'color' => 'black']);
-        DangerLevel::factory()->create(['name' => 'Négligeable', 'value' => 25, 'color' => '#395B64']);
-        DangerLevel::factory()->create(['name' => 'Important', 'value' => 75, 'color' => 'red']);
-        DangerLevel::factory()->create(['name' => 'Limité', 'value' => 50, 'color' => 'grey']);
+        DangerLevel::factory()->create([
+            'name' => 'Négligeable',
+            'value' => 25,
+            'color' => '#468355',
+            'description' => 'La structure sera faiblement impactée, la résolution prendra quelques jours, aucune séquelle ne sera perceptible.',
+        ]);
+        DangerLevel::factory()->create([
+            'name' => 'Limité',
+            'value' => 50,
+            'color' => '#FFC107',
+            'description' => 'La structure sera faiblement impactée, la résolution prendra plusieurs semaines, aucune séquelle ne sera perceptible.',
+        ]);
+        DangerLevel::factory()->create([
+            'name' => 'Important',
+            'value' => 75,
+            'color' => '#D63F49',
+            'description' => 'La structure sera fortement impactée, la résolution prendra plusieurs semaines, les séquelles seront perceptibles sur plusieurs mois.',
+        ]);
+        DangerLevel::factory()->create([
+            'name' => 'Critique',
+            'value' => 100,
+            'color' => '#454545',
+            'description' => 'La structure sera fortement impactée, la résolution prendra plusieurs mois, les séquelles seront perceptibles sur plusieurs années.',
+        ]);
     }
 }
diff --git a/database/seeders/InstanceSeeder.php b/database/seeders/InstanceSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..c21a8fd55a61867bc7fead14225815ed607d0cd0
--- /dev/null
+++ b/database/seeders/InstanceSeeder.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Database\Seeders;
+
+use Illuminate\Database\Seeder;
+
+class InstanceSeeder extends Seeder
+{
+    /**
+     * Seed the application's database.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $this->call(MeasureSeeder::class);
+        $this->call(DangerLevelSeeder::class);
+        $this->call(DangerSeeder::class);
+        $this->call(ScenarioSeeder::class);
+        $this->call(MaturityQuestionSeeder::class);
+        $this->call(MaturityAnswerSeeder::class);
+        $this->call(UserSeeder::class);
+    }
+}
diff --git a/database/seeders/MeasureSeeder.php b/database/seeders/MeasureSeeder.php
index 28de5ca8e58b19b3e19472cd6bd18cd2d0c201d5..b384ae9a2b8abadf0673b4d651b0a50031e76adc 100644
--- a/database/seeders/MeasureSeeder.php
+++ b/database/seeders/MeasureSeeder.php
@@ -16,117 +16,155 @@ class MeasureSeeder extends Seeder
     public function run()
     {
         Measure::firstOrCreate([
-            'name' => 'Quelle sécurité logicielle est mise en place ?',
-            'short_name' => 'AV et outils complémentaires',
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Un antivirus professionnel avec mises à jour est installé sur tous les postes',
-            'level1_preconized_label' => 'Installer un antivirus professionnel à jour sur tous les postes',
-            'level1_file' => null,
-            'level1_description' => 'La collectivité possède : - un antivirus professionnel à jour sur chaque poste',
+            'name' => 'Quelles sont les politiques de mots de passe ?',
+            'short_name' => 'Mots de passe',
             'level1_difficulty' => 1,
-            'level1_cost' => '20€/poste/an , 50€/serveur/an',
-            'level1_duration' => '2-5J',
-            'level1_assistance' => 1,
-            'level1_info' => 'Le coût varie selon le type de matériel à protéger (serveur ou poste)',
-            'level2_actual_label' => 'Un antivirus professionnel à jour avec options complémentaires est installé sur tous les postes',
-            'level2_preconized_label' => 'Installer un antivirus professionnel avec options complémentaires à jour sur tous les postes',
-            'level2_file' => null,
-            'level2_description' => 'La collectivité possède : - un antivirus professionnel (avec module complémentaires filtrage web, anti-hameçonnage, renforcement des transactions) à jour sur chaque poste',
             'level2_difficulty' => 1,
-            'level2_cost' => '60€/poste/an , 100€/serveur/an',
-            'level2_duration' => '2-5J',
+            'level3_difficulty' => 1,
+            'level1_cost' => '0',
+            'level2_cost' => '0',
+            'level3_cost' => '0',
+            'level1_duration' => '20 minutes',
+            'level2_duration' => '30 minutes/poste',
+            'level3_duration' => '1J',
+            'level1_assistance' => 1,
             'level2_assistance' => 1,
-            'level2_info' => 'Le coût varie selon le type de matériel à protéger (serveur ou poste)',
-            'level3_actual_label' => 'Il y a une vérification annuelle des alertes. La collectivité possède son serveur DNS.',
-            'level3_preconized_label' => 'Vérifier les alertes au moins une fois par an. Disposer de son propre serveur DNS.',
-            'level3_file' => null,
-            'level3_description' => "La collectivité s'assure :  - que les alertes sont vérifiées annuellement, - qu'elle a son propre serveur DNS. ",
-            'level3_difficulty' => 2,
-            'level3_cost' => 'Modérée',
-            'level3_duration' => 'Modérée',
             'level3_assistance' => 2,
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Le mot de passe personnel de session Windows comprend 9 caractères.',
+            'level2_actual_label' => 'Les mots de passe de session Windows et de messagerie comprennent 12 caractères.',
+            'level3_actual_label' => 'Le mot de passe de session Windows est de qualité et associé à un compte sans privilèges.',
+            'level1_preconized_label' => "Disposer d'un mot de passe personnel de session Windows comprenant 9 caractères.",
+            'level2_preconized_label' => "Disposer d'un mot de passe de session Windows et de messagerie comprenant 12 caractères.",
+            'level3_preconized_label' => "Créer un mot de passe de session Windows de qualité et disposer d'un compte sans privilèges.",
+            'level1_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe de connexion Windows personnel comprenant 9 caractères (chiffre, minuscule, majuscule, caractères spéciaux).</li></ul>",
+            'level2_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe Windows personnel et de messagerie distinct comprenant 12 caractères (chiffre, minuscule, majuscule, caractères spéciaux) et changement tous les 2 ans.</li></ul>",
+            'level3_description' => "La collectivité s'assure : <ul><li>que chaque utilisateur dispose d'un mot de passe personnel pour la session Windows avec un compte sans privilèges (utilisateur).</li><li>que le mot de passe de la session doit comprendre au moins 12 caractères (chiffres, minuscules, majuscules, caractères spéciaux) et changement tous les 2 ans.</li></ul>",
+            'level1_info' => '',
+            'level2_info' => 'Le mot de passe de la session Windows et celui de la messagerie doivent être différents.',
             'level3_info' => '',
+            'level1_file' => null,
+            'level2_file' => null,
+            'level3_file' => null,
             'level0_value' => 0,
-            'level1_value' => 45,
-            'level2_value' => 70,
-            'level3_value' => 100,
-            'fundamental' => false,
+            'level1_value' => 90,
+            'level2_value' => 140,
+            'level3_value' => 200,
+            'fundamental' => true,
         ]);
 
         Measure::firstOrCreate([
-            'name' => 'Quelle sécurité logique est mise en place ?',
-            'short_name' => 'Cloisonnement réseaux',
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Le pare-feu local est activé et les communications entrantes sont bloquées.',
-            'level1_preconized_label' => 'Activer le pare-feu local et bloquer les communications entrantes.',
-            'level1_file' => null,
-            'level1_description' => 'La collectivité possède : - un parefeu activé qui bloque les connexions entrantes',
+            'name' => 'Comment les sauvegardes sont-elle gérées ?',
+            'short_name' => 'Sauvegardes',
             'level1_difficulty' => 1,
-            'level1_cost' => '0',
-            'level1_duration' => '1J',
-            'level1_assistance' => 1,
-            'level1_info' => '',
-            'level2_actual_label' => 'Un réseau Wi-Fi dédié et isolé est réservé pour les visiteurs.',
-            'level2_preconized_label' => 'Configurer un réseau Wi-Fi dédié et isolé pour les visiteurs.',
-            'level2_file' => null,
-            'level2_description' => 'La collectivité possède : - un Wifi dédié et cloisonné pour les personnes extérieures',
             'level2_difficulty' => 1,
-            'level2_cost' => '0',
-            'level2_duration' => '4h',
-            'level2_assistance' => 1,
-            'level2_info' => "Toutes les bornes Wi-Fi ne disposent pas d'une interface d'administration, vérifiez la présence de cette fonctionalité avant approvisionnement.",
-            'level3_actual_label' => 'Un réseau est réservé aux copieurs. Un tunnel VPN est configuré pour le télétravail.',
-            'level3_preconized_label' => 'Configurer un réseau dédié et isolé pour les copieurs. Paramétrer un tunnel VPN pour le télétravail.',
+            'level3_difficulty' => 2,
+            'level1_cost' => '100-750€ pour un DDE ou NAS configuré',
+            'level2_cost' => '100-750€ pour un DDE ou NAS configuré',
+            'level3_cost' => '0',
+            'level1_duration' => '1,5J',
+            'level2_duration' => '',
+            'level3_duration' => '1J',
+            'level1_assistance' => 2,
+            'level2_assistance' => 2,
+            'level3_assistance' => 3,
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Il y a une sauvegarde régulière sur un support externe',
+            'level2_actual_label' => 'Une sauvegarde est externalisée',
+            'level3_actual_label' => 'Un test de restauration de sauvegarde est réalisé annuellement',
+            'level1_preconized_label' => 'Sauvegarder régulièrement sur un support externe',
+            'level2_preconized_label' => 'Externaliser une sauvegarde',
+            'level3_preconized_label' => 'Tester annuellement une restauration de sauvegarde',
+            'level1_description' => 'La collectivité possède : <ul><li>Une sauvegarde régulière sur un support externe et une copie réalisée sur un autre support.</li></ul>',
+            'level2_description' => 'La collectivité possède : <ul><li>une sauvegarde manuelle régulière sur deux supports différents. - une des sauvegardes est externalisée.</li></ul>',
+            'level3_description' => "La collectivité s'assure : <ul><li>qu'une fois par an un test de restauration technique est réalisé.</li></ul>",
+            'level1_info' => 'Si vous disposez d’un logiciel de sauvegarde, les sauvegardes seront facilitées et prendront moins de temps.',
+            'level2_info' => 'Le coût varie selon le type de matériel choisi (disque dur externe ou NAS avec configuration)',
+            'level3_info' => '',
+            'level1_file' => null,
+            'level2_file' => null,
             'level3_file' => null,
-            'level3_description' => 'La collectivité possède : - un réseau dédié et isolé pour les copieurs, - un accès VPN pour les personnes à distance',
-            'level3_difficulty' => 3,
-            'level3_cost' => '100€/poste. Boitier pare-feu dès 1500€',
-            'level3_duration' => '2J',
-            'level3_assistance' => 2,
-            'level3_info' => 'Si vos copieurs sont en IP dynamiques, il peut être nécessaire de voir avec votre prestataire pour rentrer une IP statique.',
             'level0_value' => 0,
-            'level1_value' => 45,
-            'level2_value' => 70,
-            'level3_value' => 100,
-            'fundamental' => false,
+            'level1_value' => 90,
+            'level2_value' => 140,
+            'level3_value' => 200,
+            'fundamental' => true,
         ]);
 
         Measure::firstOrCreate([
-            'name' => "Est-ce qu'un suivi des contrats et prestataires existe ?",
-            'short_name' => 'Contrats',
-            'level0_actual_label' => 'Aucun',
-            'level1_actual_label' => 'Un inventaire des contrats est disponible',
-            'level1_preconized_label' => 'Inventorier les contrats.',
+            'name' => 'Comment les mises à jour sont-elles gérées ?',
+            'short_name' => 'MAJ',
+            'level1_difficulty' => '1',
+            'level2_difficulty' => '1',
+            'level3_difficulty' => '1',
+            'level1_cost' => '0-1500€/poste',
+            'level2_cost' => '0',
+            'level3_cost' => '0',
+            'level1_duration' => '4h',
+            'level2_duration' => '15min/poste',
+            'level3_duration' => '15min/poste',
+            'level1_assistance' => '2',
+            'level2_assistance' => '1',
+            'level3_assistance' => '1',
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Il y a une automatisation des mises à jour Windows et les postes obsolètes sont remplacés.',
+            'level2_actual_label' => 'Il y a une automatisation des mises à jour des navigateurs et suites bureautiques',
+            'level3_actual_label' => 'Un contrôle annuel des mises à jour des postes, navigateurs et suites bureautiques est réalisé.',
+            'level1_preconized_label' => 'Automatiser les mises à jour Windows et remplacer les postes obsolètes',
+            'level2_preconized_label' => 'Automatiser les mises à jour des navigateurs et suites bureautiques',
+            'level3_preconized_label' => 'Contrôler annuellement les mises à jours des postes, navigateurs et suites bureautiques.',
+            'level1_description' => "La collectivité s'assure : <ul><li>que chaque poste est configuré pour que Windows se mette à jour automatiquement et régulièrement.</li><li>que les postes obsolètes sont remplacés.</li></ul>",
+            'level2_description' => 'Chaque poste est configuré pour que les navigateurs et les suites bureautiques se mettent à jour automatiquement et régulièrement',
+            'level3_description' => "La collectivité s'assure : <ul><li>que la bonne mise à jour des postes, des navigateurs et des suites bureautiques est vérifiée au moins une fois par an.</li></ul>",
+            'level1_info' => "Des mises à jour sont publiées régulièrement, il est donc conseiller d'effectuer cette action toutes les semaines.",
+            'level2_info' => "Des mises à jour sont publiées régulièrement, il est donc conseiller d'effectuer cette action toutes les semaines.",
+            'level3_info' => '',
             'level1_file' => null,
-            'level1_description' => 'La collectivité possède : - Un inventaire des contrats mis à jour une fois par an',
+            'level2_file' => null,
+            'level3_file' => null,
+            'level0_value' => 0,
+            'level1_value' => 90,
+            'level2_value' => 140,
+            'level3_value' => 200,
+            'fundamental' => true,
+        ]);
+
+        Measure::firstOrCreate([
+            'name' => 'Quelles sont les actions de sensibilisation mises en place ?',
+            'short_name' => 'Sensibilisation',
             'level1_difficulty' => 1,
+            'level2_difficulty' => 1,
+            'level3_difficulty' => 2,
             'level1_cost' => '0',
-            'level1_duration' => '7h',
+            'level2_cost' => '0',
+            'level3_cost' => '0-700€',
+            'level1_duration' => '10h',
+            'level2_duration' => '2J',
+            'level3_duration' => '3J',
             'level1_assistance' => 1,
+            'level2_assistance' => 2,
+            'level3_assistance' => 2,
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Les fiches pratiques Cybermalveillance sont diffusées',
+            'level2_actual_label' => 'Il y a des participations à des événementiels sur la cybersécurité.',
+            'level3_actual_label' => 'Une sensibilisation annuelle sur les risques du numérique et les bonnes pratiques est organisée',
+            'level1_preconized_label' => 'Diffuser les fiches pratiques Cybermalveillance',
+            'level2_preconized_label' => 'Participer à des événementiels locaux ou nationaux sur la cybersécurité.',
+            'level3_preconized_label' => 'Sensibiliser annuellement sur les risques du numérique et les bonnes pratiques',
+            'level1_description' => "La collectivité s'assure : <ul><li>que les fiches pratiques Cybermalveillance sont diffusées aux agents et élus de la collectivité.</li></ul>",
+            'level2_description' => "La collectivité s'assure : <ul><li>que les agents et élus suivent régulièrement des événementiels locaux ou nationaux ayant trait à la cybersécurité.</li></ul>",
+            'level3_description' => "La collectivité s'assure : <ul><li>qu'une réunion de sensibilisation annuelle sur les risques du numérique et les bonnes pratiques est organisée avec l’ensemble des agents et des élus.</li></ul>",
             'level1_info' => '',
-            'level2_actual_label' => 'Les contrats sensibles au niveau SSI sont identifés',
-            'level2_preconized_label' => 'Identifier les contrats sensibles au niveau SSI',
-            'level2_file' => null,
-            'level2_description' => "La collectivité s'assure : - que les contrats les plus sensibles au niveau de la sécurité du système d’information (SSI) sont identifiés.",
-            'level2_difficulty' => 1,
-            'level2_cost' => '0',
-            'level2_duration' => '7h',
-            'level2_assistance' => 3,
             'level2_info' => '',
-            'level3_actual_label' => 'Des règles de sécurités minimales sont imposées aux prestataires sensibles.',
-            'level3_preconized_label' => 'Imposer des règles de sécurités minimales aux prestataires sensibles.',
+            'level3_info' => 'Selon que vous prépariez vous-même une fiche ou que vous réutilisez les ressources en ligne, l’investissement en temps ne sera pas le même.',
+            'level1_file' => null,
+            'level2_file' => null,
             'level3_file' => null,
-            'level3_description' => "La collectivité s'assure : - que les règles de sécurités minimales sont imposées aux prestataires sensibles.",
-            'level3_difficulty' => 1,
-            'level3_cost' => '0-1000€',
-            'level3_duration' => '5J',
-            'level3_assistance' => 3,
-            'level3_info' => '',
             'level0_value' => 0,
-            'level1_value' => 45,
-            'level2_value' => 70,
-            'level3_value' => 100,
-            'fundamental' => false,
+            'level1_value' => 90,
+            'level2_value' => 140,
+            'level3_value' => 200,
+            'fundamental' => true,
         ]);
 
         Measure::firstOrCreate([
@@ -144,16 +182,16 @@ public function run()
             'level1_assistance' => 1,
             'level2_assistance' => 2,
             'level3_assistance' => 1,
-            'level0_actual_label' => 'Aucun',
-            'level1_actual_label' => "Un inventaire des droits d'accès Windows, comptes de messagerie et session Windows est disponible",
+            'level0_actual_label' => 'Aucun ou ne sait pas',
+            'level1_actual_label' => "Un inventaire des droits d'accès Windows, comptes de messagerie et sessions Windows est disponible",
             'level2_actual_label' => "Un inventaire des droits d'accès des applications métiers et gestion du départ des collaborateurs est disponible.",
             'level3_actual_label' => 'Un contrôle annuel des inventaires est réalisé.',
-            'level1_preconized_label' => "Inventorier les droits d'accès Windows, comptes de messagerie et session Windows.",
+            'level1_preconized_label' => "Inventorier les droits d'accès Windows, comptes de messagerie et sessions Windows.",
             'level2_preconized_label' => "Inventorier les droits d'accès des applications métiers et gérer le départ des collaborateurs.",
             'level3_preconized_label' => 'Contrôler annuellement les inventaires.',
-            'level1_description' => "La collectivité s'assure : -qu'un inventaire des droits d'accès Windows est disponible et mis à jour une fois par an. - que les comptes de messagerie et des session Windows sont nominatifs.",
-            'level2_description' => "La collectivité s'assure : -qu'un inventaire des droits d'accès des applications métiers est disponible et mis à jour une fois par an. - que le départ des collaborateurs est géré (retrait des droits d’accès).",
-            'level3_description' => "La collectivité s'assure : - qu'un contrôle est réalisé une fois par an sur la base des inventaires.",
+            'level1_description' => "La collectivité s'assure : <ul><li>qu'un inventaire des droits d'accès Windows est disponible et mis à jour une fois par an.</li><li>que les comptes de messagerie et des sessions Windows sont nominatifs.</li></ul>",
+            'level2_description' => "La collectivité s'assure : <ul><li>qu'un inventaire des droits d'accès des applications métiers est disponible et mis à jour une fois par an.</li><li>que le départ des collaborateurs est géré (retrait des droits d’accès).</li></ul>",
+            'level3_description' => "La collectivité s'assure : <ul><li>qu'un contrôle est réalisé une fois par an sur la base des inventaires.</li>",
             'level1_info' => "La réalisation de l'inventaire peut prendre du temps la première fois mais les mises à jours annuelles seront plus rapides à réaliser.",
             'level2_info' => "La réalisation de l'inventaire peut prendre du temps la première fois mais les mises à jours annuelles seront plus rapides à réaliser.",
             'level3_info' => '',
@@ -168,41 +206,41 @@ public function run()
         ]);
 
         Measure::firstOrCreate([
-            'name' => 'Comment les mises à jour sont-elles gérées ?',
-            'short_name' => 'MAJ',
-            'level1_difficulty' => '1',
-            'level2_difficulty' => '1',
-            'level3_difficulty' => '1',
-            'level1_cost' => '0-1500€/poste',
-            'level2_cost' => '0',
-            'level3_cost' => '0',
-            'level1_duration' => '4h',
-            'level2_duration' => '15min/poste',
-            'level3_duration' => '15min/poste',
-            'level1_assistance' => '2',
-            'level2_assistance' => '1',
-            'level3_assistance' => '1',
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Il y a une automatisation des mises à jour Windows et les postes obsolètes sont remplacés.',
-            'level2_actual_label' => 'Il y a une automatisation des mises à jour des navigateurs et suites bureautiques',
-            'level3_actual_label' => 'Un contrôle annuel des mises à jours des postes, navigateurs et suites bureautiques est réalisé.',
-            'level1_preconized_label' => 'Automatiser les mises à jour Windows et remplacer les postes obsolètes',
-            'level2_preconized_label' => 'Automatiser les mises à jour des navigateurs et suites bureautiques',
-            'level3_preconized_label' => 'Contrôler annuellement les mises à jours des postes, navigateurs et suites bureautiques.',
-            'level1_description' => "La collectivité s'assure : - que chaque poste est configuré pour que Windows se mette à jour automatiquement et régulièrement. - que les postes obsolètes sont remplacés.",
-            'level2_description' => 'Chaque poste est configuré pour que les navigateurs et les suites bureautiques se mettent à jour automatiquement et régulièrement',
-            'level3_description' => "La collectivité s'assure : - que la bonne mise à jour des postes, des navigateurs et des suites bureautiques est vérifiée au moins une fois par an.",
-            'level1_info' => "Des mises à jour sont publiées régulièrement, il est donc conseiller d'effectuer cette action toutes les semaines.",
-            'level2_info' => "Des mises à jour sont publiées régulièrement, il est donc conseiller d'effectuer cette action toutes les semaines.",
-            'level3_info' => '',
+            'name' => 'Quelle sécurité logique est mise en place ?',
+            'short_name' => 'Cloisonnement réseaux',
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Le pare-feu local est activé et les communications entrantes sont bloquées.',
+            'level1_preconized_label' => 'Activer le pare-feu local et bloquer les communications entrantes.',
             'level1_file' => null,
+            'level1_description' => 'La collectivité possède : <ul><li>un parefeu activé qui bloque les connexions entrantes</li></ul>',
+            'level1_difficulty' => 1,
+            'level1_cost' => '0',
+            'level1_duration' => '1J',
+            'level1_assistance' => 1,
+            'level1_info' => '',
+            'level2_actual_label' => 'Un réseau Wi-Fi dédié et isolé est réservé pour les visiteurs.',
+            'level2_preconized_label' => 'Configurer un réseau Wi-Fi dédié et isolé pour les visiteurs.',
             'level2_file' => null,
+            'level2_description' => 'La collectivité possède : <ul><li>un Wifi dédié et cloisonné pour les personnes extérieures</li></ul>',
+            'level2_difficulty' => 1,
+            'level2_cost' => '0',
+            'level2_duration' => '4h',
+            'level2_assistance' => 1,
+            'level2_info' => "Toutes les bornes Wi-Fi ne disposent pas d'une interface d'administration, vérifiez la présence de cette fonctionalité avant approvisionnement.",
+            'level3_actual_label' => 'Un réseau est réservé aux copieurs. Un tunnel VPN est configuré pour le télétravail.',
+            'level3_preconized_label' => 'Configurer un réseau dédié et isolé pour les copieurs. Paramétrer un tunnel VPN pour le télétravail.',
             'level3_file' => null,
+            'level3_description' => 'La collectivité possède : <ul><li>un réseau dédié et isolé pour les copieurs,</li><li>un accès VPN pour les personnes à distance</li></ul>',
+            'level3_difficulty' => 3,
+            'level3_cost' => '100€/poste. Boitier pare-feu dès 1500€',
+            'level3_duration' => '2J',
+            'level3_assistance' => 2,
+            'level3_info' => 'Si vos copieurs sont en IP dynamiques, il peut être nécessaire de voir avec votre prestataire pour rentrer une IP statique.',
             'level0_value' => 0,
-            'level1_value' => 90,
-            'level2_value' => 140,
-            'level3_value' => 200,
-            'fundamental' => true,
+            'level1_value' => 45,
+            'level2_value' => 70,
+            'level3_value' => 100,
+            'fundamental' => false,
         ]);
 
         Measure::firstOrCreate([
@@ -220,16 +258,16 @@ public function run()
             'level1_assistance' => 3,
             'level2_assistance' => 2,
             'level3_assistance' => 3,
-            'level0_actual_label' => 'Aucune',
+            'level0_actual_label' => 'Aucune ou ne sait pas',
             'level1_actual_label' => "Contact de Cybermalveillance, gendarmerie/police ou mon OPSN en cas d'incidents cyber.",
             'level2_actual_label' => 'Une fiche réflexe rançongiciel est affichée',
             'level3_actual_label' => 'Il existe une fiche avec les étapes clés de la reconstruction de mon SI.',
             'level1_preconized_label' => "Contacter Cybermalveillance, gendarmerie/police ou mon OPSN en cas d'incidents cyber.",
             'level2_preconized_label' => 'Afficher une fiche réflexe rançongiciel',
             'level3_preconized_label' => 'Formaliser une fiche avec les étapes clés de la reconstruction de mon SI.',
-            'level1_description' => "La collectivité s'assure : -de contacter Cybermalveillance, la gendarmerie ou la police et/ou son OPSN en cas d'incidents cyber.",
-            'level2_description' => 'La collectivité possède : -un document expliquant comment réagir en cas de ransomware/rançongiciel et affiché pour les agents dans la collectivité',
-            'level3_description' => 'La collectivité possède : -des documents sur les opérations nécessaires à la reconstruction de son système d’information (SI).',
+            'level1_description' => "La collectivité s'assure :<ul><li>de contacter Cybermalveillance, la gendarmerie ou la police et/ou son OPSN en cas d'incidents cyber.</li></ul>",
+            'level2_description' => 'La collectivité possède : <ul><li>un document expliquant comment réagir en cas de ransomware/rançongiciel et affiché pour les agents dans la collectivité</li></ul>',
+            'level3_description' => 'La collectivité possède : <ul><li>des documents sur les opérations nécessaires à la reconstruction de son système d’information (SI).</li></ul>',
             'level1_info' => '',
             'level2_info' => 'Selon que vous prépariez vous-même une fiche ou que vous réutilisez les ressources en ligne, l’investissement en temps ne sera pas le même.',
             'level3_info' => '',
@@ -244,36 +282,36 @@ public function run()
         ]);
 
         Measure::firstOrCreate([
-            'name' => "Comment le système d'information est-il décrit ?",
-            'short_name' => 'Plan informatique',
+            'name' => 'Quelle sécurité logicielle est mise en place ?',
+            'short_name' => 'AV et outils complémentaires',
+            'level0_actual_label' => 'Aucune ou ne sait pas',
+            'level1_actual_label' => 'Un antivirus professionnel avec mises à jour est installé sur tous les postes',
+            'level1_preconized_label' => 'Installer un antivirus professionnel à jour sur tous les postes',
+            'level1_file' => null,
+            'level1_description' => 'La collectivité possède : <ul><li>un antivirus professionnel à jour sur chaque poste</li></ul>',
             'level1_difficulty' => 1,
+            'level1_cost' => '20€/poste/an , 50€/serveur/an',
+            'level1_duration' => '2-5J',
+            'level1_assistance' => 1,
+            'level1_info' => 'Le coût varie selon le type de matériel à protéger (serveur ou poste)',
+            'level2_actual_label' => 'Un antivirus professionnel à jour avec options complémentaires est installé sur tous les postes',
+            'level2_preconized_label' => 'Installer un antivirus professionnel avec options complémentaires à jour sur tous les postes',
+            'level2_file' => null,
+            'level2_description' => 'La collectivité possède : <ul><li>un antivirus professionnel (avec module complémentaires filtrage web, anti-hameçonnage, renforcement des transactions) à jour sur chaque poste</li></ul>',
             'level2_difficulty' => 1,
-            'level3_difficulty' => 1,
-            'level1_cost' => '0',
-            'level2_cost' => '0',
-            'level3_cost' => '0',
-            'level1_duration' => '3h',
-            'level2_duration' => '8h',
-            'level3_duration' => '3h',
-            'level1_assistance' => 2,
-            'level2_assistance' => 2,
+            'level2_cost' => '60€/poste/an , 100€/serveur/an',
+            'level2_duration' => '2-5J',
+            'level2_assistance' => 1,
+            'level2_info' => 'Le coût varie selon le type de matériel à protéger (serveur ou poste)',
+            'level3_actual_label' => 'Il y a une vérification annuelle des alertes. La collectivité possède son serveur DNS.',
+            'level3_preconized_label' => 'Vérifier les alertes au moins une fois par an. Disposer de son propre serveur DNS.',
+            'level3_file' => null,
+            'level3_description' => "La collectivité s'assure :  <ul><li>que les alertes sont vérifiées annuellement, </li><li>qu'elle a son propre serveur DNS.</li></ul>",
+            'level3_difficulty' => 2,
+            'level3_cost' => 'Modérée',
+            'level3_duration' => 'Modérée',
             'level3_assistance' => 2,
-            'level0_actual_label' => 'Aucun',
-            'level1_actual_label' => 'Un inventaire des équipements informatiques est disponible et mis à jour annuellement',
-            'level2_actual_label' => "Un schéma d'implantation par bâtiment est disponible et mis à jour annuellement",
-            'level3_actual_label' => 'Un schéma réseau est disponible et mis à jour annuellement',
-            'level1_preconized_label' => 'Inventorier les équipements informatiques',
-            'level2_preconized_label' => "Disposer d'un schéma d'implantation par bâtiment",
-            'level3_preconized_label' => "Disposer d'un schéma réseau",
-            'level1_description' => 'La collectivité possède : - un inventaire des équipements informatiques mis à jour une fois par an.',
-            'level2_description' => "La collectivité possède : - un schéma d'implantation par bâtiment mis à jour une fois par an.",
-            'level3_description' => 'La collectivité possède : - un schéma réseau mis à jour une fois par an',
-            'level1_info' => '',
-            'level2_info' => '',
             'level3_info' => '',
-            'level1_file' => null,
-            'level2_file' => null,
-            'level3_file' => null,
             'level0_value' => 0,
             'level1_value' => 45,
             'level2_value' => 70,
@@ -282,118 +320,81 @@ public function run()
         ]);
 
         Measure::firstOrCreate([
-            'name' => 'Quelles sont les politiques de mots de passe ?',
-            'short_name' => 'Mots de passe',
+            'name' => "Est-ce qu'un suivi des contrats et prestataires existe ?",
+            'short_name' => 'Contrats',
+            'level0_actual_label' => 'Aucun ou ne sait pas',
+            'level1_actual_label' => 'Un inventaire des contrats est disponible',
+            'level1_preconized_label' => 'Inventorier les contrats.',
+            'level1_file' => null,
+            'level1_description' => 'La collectivité possède : <ul><li>Un inventaire des contrats mis à jour une fois par an</li></ul>',
             'level1_difficulty' => 1,
-            'level2_difficulty' => 1,
-            'level3_difficulty' => 1,
             'level1_cost' => '0',
-            'level2_cost' => '0',
-            'level3_cost' => '0',
-            'level1_duration' => '20 minutes',
-            'level2_duration' => '30 minutes/poste',
-            'level3_duration' => '1J',
+            'level1_duration' => '7h',
             'level1_assistance' => 1,
-            'level2_assistance' => 1,
-            'level3_assistance' => 2,
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Le mot de passe personnel de session Windows comprend 9 caractères.',
-            'level2_actual_label' => 'Les mots de passe de session Windows et de messagerie comprennent 12 caractères.',
-            'level3_actual_label' => 'Le mot de passe de session Windows est de qualité et associé à un compte sans privilèges.',
-            'level1_preconized_label' => "Disposer d'un mot de passe personnel de session Windows comprenant 9 caractères.",
-            'level2_preconized_label' => "Disposer d'un mot de passe de session Windows et de messagerie comprenant 12 caractères.",
-            'level3_preconized_label' => "Créer un mot de passe de session Windows de qualité et disposer d'un compte sans privilèges.",
-            'level1_description' => "La collectivité s'assure : - que chaque utilisateur dispose d'un mot de passe de connexion Windows personnel comprenant 9 caractères (chiffre, minuscule, majuscule, caractères spéciaux).",
-            'level2_description' => "La collectivité s'assure : - que chaque utilisateur dispose d'un mot de passe Windows personnel et de messagerie distinct comprenant 12 caractères (chiffre, minuscule, majuscule, caractères spéciaux) et changement tous les 2 ans.",
-            'level3_description' => "La collectivité s'assure : - que chaque utilisateur dispose d'un mot de passe personnel pour la session Windows avec un compte sans privilèges (utilisateur). - que le mot de passe de la session doit comprendre au moins 12 caractères (chiffres, minuscules, majuscules, caractères spéciaux) et changement tous les 2 ans.",
             'level1_info' => '',
-            'level2_info' => 'Le mot de passe de la session Windows et celui de la messagerie doivent être différents.',
-            'level3_info' => '',
-            'level1_file' => null,
+            'level2_actual_label' => 'Les contrats sensibles au niveau SSI sont identifés',
+            'level2_preconized_label' => 'Identifier les contrats sensibles au niveau SSI',
             'level2_file' => null,
-            'level3_file' => null,
-            'level0_value' => 0,
-            'level1_value' => 90,
-            'level2_value' => 140,
-            'level3_value' => 200,
-            'fundamental' => true,
-        ]);
-
-        Measure::firstOrCreate([
-            'name' => 'Comment les sauvegardes sont-elle gérées ?',
-            'short_name' => 'Sauvegardes',
-            'level1_difficulty' => 1,
+            'level2_description' => "La collectivité s'assure : <ul><li>que les contrats les plus sensibles au niveau de la sécurité du système d’information (SSI) sont identifiés.</li></ul>",
             'level2_difficulty' => 1,
-            'level3_difficulty' => 2,
-            'level1_cost' => '100-750€ pour un DDE ou NAS configuré',
-            'level2_cost' => '100-750€ pour un DDE ou NAS configuré',
-            'level3_cost' => '0',
-            'level1_duration' => '1,5J',
-            'level2_duration' => '',
-            'level3_duration' => '1J',
-            'level1_assistance' => 2,
-            'level2_assistance' => 2,
+            'level2_cost' => '0',
+            'level2_duration' => '7h',
+            'level2_assistance' => 3,
+            'level2_info' => '',
+            'level3_actual_label' => 'Des règles de sécurités minimales sont imposées aux prestataires sensibles.',
+            'level3_preconized_label' => 'Imposer des règles de sécurités minimales aux prestataires sensibles.',
+            'level3_file' => null,
+            'level3_description' => "La collectivité s'assure : <ul><li>que les règles de sécurités minimales sont imposées aux prestataires sensibles.</li></ul>",
+            'level3_difficulty' => 1,
+            'level3_cost' => '0-1000€',
+            'level3_duration' => '5J',
             'level3_assistance' => 3,
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Il y a une sauvegarde régulière sur un support externe',
-            'level2_actual_label' => 'Une sauvegarde est externalisée',
-            'level3_actual_label' => 'Un test de restauration de sauvegarde est réalisé annuellement',
-            'level1_preconized_label' => 'Sauvegarder régulièrement sur un support externe',
-            'level2_preconized_label' => 'Externaliser une sauvegarde',
-            'level3_preconized_label' => 'Tester annuellement une restauration de sauvegarde',
-            'level1_description' => 'La collectivité possède : - Une sauvegarde régulière sur un support externe et une copie réalisée sur un autre support.',
-            'level2_description' => 'La collectivité possède : - une sauvegarde manuelle régulière sur deux supports différents. - une des sauvegardes est externalisée.',
-            'level3_description' => "La collectivité s'assure : - qu'une fois par an un test de restauration technique est réalisé.",
-            'level1_info' => 'Si vous disposez d’un logiciel de sauvegarde, les sauvegardes seront facilitées et prendront moins de temps.',
-            'level2_info' => 'Le coût varie selon le type de matériel choisi (disque dur externe ou NAS avec configuration)',
             'level3_info' => '',
-            'level1_file' => null,
-            'level2_file' => null,
-            'level3_file' => null,
             'level0_value' => 0,
-            'level1_value' => 90,
-            'level2_value' => 140,
-            'level3_value' => 200,
-            'fundamental' => true,
+            'level1_value' => 45,
+            'level2_value' => 70,
+            'level3_value' => 100,
+            'fundamental' => false,
         ]);
 
         Measure::firstOrCreate([
-            'name' => 'Quelles sont les actions de sensibilisation mises en place ?',
-            'short_name' => 'Sensibilisation',
+            'name' => "Comment le système d'information est-il décrit ?",
+            'short_name' => 'Plan informatique',
             'level1_difficulty' => 1,
             'level2_difficulty' => 1,
-            'level3_difficulty' => 2,
+            'level3_difficulty' => 1,
             'level1_cost' => '0',
             'level2_cost' => '0',
-            'level3_cost' => '0-700€',
-            'level1_duration' => '10h',
-            'level2_duration' => '2J',
-            'level3_duration' => '3J',
-            'level1_assistance' => 1,
+            'level3_cost' => '0',
+            'level1_duration' => '3h',
+            'level2_duration' => '8h',
+            'level3_duration' => '3h',
+            'level1_assistance' => 2,
             'level2_assistance' => 2,
             'level3_assistance' => 2,
-            'level0_actual_label' => 'Aucune',
-            'level1_actual_label' => 'Les fiches pratiques Cybermalveillance sont diffusées',
-            'level2_actual_label' => 'Il y a des participations à des événementiels sur la cybersécurité.',
-            'level3_actual_label' => 'Une sensibilisation annuelle sur les risques du numérique et les bonnes pratiques est organisée',
-            'level1_preconized_label' => 'Diffuser les fiches pratiques Cybermalveillance',
-            'level2_preconized_label' => 'Participer à des événementiels locaux ou nationaux sur la cybersécurité.',
-            'level3_preconized_label' => 'Sensibiliser annuellement sur les risques du numérique et les bonnes pratiques',
-            'level1_description' => "La collectivité s'assure : -que les fiches pratiques Cybermalveillance sont diffusées aux agents et élus de la collectivité.",
-            'level2_description' => "La collectivité s'assure : - que les agents et élus suivent régulièrement des événementiels locaux ou nationaux ayant trait à la cybersécurité.",
-            'level3_description' => "La collectivité s'assure : - qu'une réunion de sensibilisation annuelle sur les risques du numérique et les bonnes pratiques est organisée avec l’ensemble des agents et des élus.",
+            'level0_actual_label' => 'Aucun ou ne sait pas',
+            'level1_actual_label' => 'Un inventaire des équipements informatiques est disponible et mis à jour annuellement',
+            'level2_actual_label' => "Un schéma d'implantation par bâtiment est disponible et mis à jour annuellement",
+            'level3_actual_label' => 'Un schéma réseau est disponible et mis à jour annuellement',
+            'level1_preconized_label' => 'Inventorier les équipements informatiques',
+            'level2_preconized_label' => "Disposer d'un schéma d'implantation par bâtiment",
+            'level3_preconized_label' => "Disposer d'un schéma réseau",
+            'level1_description' => 'La collectivité possède : <ul><li>un inventaire des équipements informatiques mis à jour une fois par an.</li></ul>',
+            'level2_description' => "La collectivité possède : <ul><li>un schéma d'implantation par bâtiment mis à jour une fois par an.</li></ul>",
+            'level3_description' => 'La collectivité possède : <ul><li>un schéma réseau mis à jour une fois par an</li></ul>',
             'level1_info' => '',
             'level2_info' => '',
-            'level3_info' => 'Selon que vous prépariez vous-même une fiche ou que vous réutilisez les ressources en ligne, l’investissement en temps ne sera pas le même.',
+            'level3_info' => '',
             'level1_file' => null,
             'level2_file' => null,
             'level3_file' => null,
             'level0_value' => 0,
-            'level1_value' => 90,
-            'level2_value' => 140,
-            'level3_value' => 200,
-            'fundamental' => true,
+            'level1_value' => 45,
+            'level2_value' => 70,
+            'level3_value' => 100,
+            'fundamental' => false,
         ]);
+
         /*
         Measure::firstOrCreate([
             'name' => "",
diff --git a/database/seeders/OrganizationSeeder.php b/database/seeders/OrganizationSeeder.php
index 97b57ca825c5d36b5efdfb93e6ded55dd3dde758..2746eab2e21efeea9200d58ffad51c933535588f 100644
--- a/database/seeders/OrganizationSeeder.php
+++ b/database/seeders/OrganizationSeeder.php
@@ -55,54 +55,7 @@ public function run()
             $org->evaluations()->saveMany(Evaluation::factory(2)->make(['current_step' => 1]));
             $org->evaluations()->saveMany(Evaluation::factory(2)->make(['current_step' => 2]));
 
-            foreach ($org->evaluations as $eval) {
-                if ($eval->current_step < Evaluation::STEP_RESULTS) {
-                    $eval->status = Evaluation::STATUS_ONGOING;
-                } else {
-                    $eval->status = Evaluation::STATUS_DONE;
-                }
-                $eval->save();
-                if ($eval->current_step >= Evaluation::STEP_DANGERS) {
-                    $dangers = Danger::all();
-
-                    $dangerLevels = $dangers->map(function (Danger $danger) {
-                        $level = DangerLevel::inRandomOrder()->first();
-                        $dangerLevel = new DangerLevelEvaluation();
-                        $dangerLevel->danger_level_id = $level->id;
-                        $dangerLevel->danger_id = $danger->id;
-
-                        return $dangerLevel;
-                    });
-
-                    $eval->dangerLevels()->saveMany($dangerLevels);
-                }
-
-                if ($eval->current_step >= Evaluation::STEP_MEASURES) {
-                    $measures = Measure::all();
-                    $evalMeasures = $measures->map(function (Measure $m) {
-                        return MeasureLevel::factory()->make([
-                            'measure_id' => $m->id,
-                        ]);
-                    });
-                    $eval->measureLevels()->saveMany($evalMeasures);
-                }
-
-                if ($eval->current_step >= Evaluation::STEP_MATURITY) {
-                    $questions = MaturityQuestion::where('auto', false)->get();
-                    $answers = $questions->map(function (MaturityQuestion $m) {
-                        $a = new EvaluationMaturityAnswer();
-                        $a->maturity_question_id = $m->id;
-                        $a->maturity_answer_id = MaturityAnswer::where('maturity_question_id', $m->id)
-                            ->inRandomOrder()
-                            ->first()->id;
-
-                        return $a;
-                    });
-                    $eval->maturityLevels()->saveMany($answers);
-
-                    $this->repository->saveAutomaticAnswers($eval);
-                }
-            }
+            $this->setEvaluationsData($org);
         });
 
         // Create inactive org with active user
@@ -115,5 +68,70 @@ public function run()
             $org->users()->saveMany(User::factory(1)->make(['role' => User::ROLE_MANAGER]));
             $org->users()->saveMany(User::factory(5)->make(['active' => false, 'role' => User::ROLE_USER]));
         });
+
+        // Create active org single completed evaluation
+        Organization::factory(1)->create(['active' => true])->each(function (Organization $org) {
+            $org->users()->saveMany(User::factory(1)->make(['role' => User::ROLE_MANAGER]));
+            $org->users()->saveMany(User::factory(5)->make(['active' => false, 'role' => User::ROLE_USER]));
+            $org->evaluations()->saveMany(Evaluation::factory(1)->make([
+                'current_step' => Evaluation::STEP_RESULTS,
+                'status' => Evaluation::STATUS_DONE,
+                'reference' => env('REFERENTIEL_VERSION'),
+            ]));
+
+            $this->setEvaluationsData($org);
+        });
+    }
+
+    private function setEvaluationsData(Organization $org)
+    {
+        foreach ($org->evaluations as $eval) {
+            if ($eval->current_step < Evaluation::STEP_RESULTS) {
+                $eval->status = Evaluation::STATUS_ONGOING;
+            } else {
+                $eval->status = Evaluation::STATUS_DONE;
+            }
+            $eval->save();
+            if ($eval->current_step >= Evaluation::STEP_DANGERS) {
+                $dangers = Danger::all();
+
+                $dangerLevels = $dangers->map(function (Danger $danger) {
+                    $level = DangerLevel::inRandomOrder()->first();
+                    $dangerLevel = new DangerLevelEvaluation();
+                    $dangerLevel->danger_level_id = $level->id;
+                    $dangerLevel->danger_id = $danger->id;
+
+                    return $dangerLevel;
+                });
+
+                $eval->dangerLevels()->saveMany($dangerLevels);
+            }
+
+            if ($eval->current_step >= Evaluation::STEP_MEASURES) {
+                $measures = Measure::all();
+                $evalMeasures = $measures->map(function (Measure $m) {
+                    return MeasureLevel::factory()->make([
+                        'measure_id' => $m->id,
+                    ]);
+                });
+                $eval->measureLevels()->saveMany($evalMeasures);
+            }
+
+            if ($eval->current_step >= Evaluation::STEP_MATURITY) {
+                $questions = MaturityQuestion::where('auto', false)->get();
+                $answers = $questions->map(function (MaturityQuestion $m) {
+                    $a = new EvaluationMaturityAnswer();
+                    $a->maturity_question_id = $m->id;
+                    $a->maturity_answer_id = MaturityAnswer::where('maturity_question_id', $m->id)
+                        ->inRandomOrder()
+                        ->first()->id;
+
+                    return $a;
+                });
+                $eval->maturityLevels()->saveMany($answers);
+
+                $eval->saveAutomaticAnswers();
+            }
+        }
     }
 }
diff --git a/database/seeders/ScenarioSeeder.php b/database/seeders/ScenarioSeeder.php
index 8e58895bee89a3a322d4fd893e840cf8dc12f1dc..1000de6a52e44aee1476d7f660277fea007bb004 100644
--- a/database/seeders/ScenarioSeeder.php
+++ b/database/seeders/ScenarioSeeder.php
@@ -66,6 +66,7 @@ public function run()
 
         // MEASURES
         $measure_scenario_matrix = [
+            // MEASURES
             0, 1, 1, 1, 1, 0, 0, 1, 0, 0,  // S
             1, 1, 1, 1, 1, 0, 1, 1, 1, 1,  // C
             0, 1, 1, 1, 0, 0, 1, 1, 1, 0,  // E
@@ -78,8 +79,25 @@ public function run()
             1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
         ];
 
+        $measureOrder = [
+            'Mots de passe',
+            'Sauvegardes',
+            'MAJ',
+            'Sensibilisation',
+            "Droits d'accès logiques",
+            'Cloisonnement réseaux',
+            'Modes dégradés',
+            'AV et outils complémentaires',
+            'Contrats',
+            'Plan informatique',
+        ];
+
+        $measures = Measure::all()->sortBy(function (Measure $m) use ($measureOrder) {
+            return array_search($m->short_name, $measureOrder);
+        })->values();
+
         foreach ($scenarios as $k => $scenario) {
-            // Insert scenario_danger
+            // Insert danger_scenario
             $dangers = Danger::all();
             foreach ($dangers as $l => $danger) {
                 if (1 === $danger_scenario_matrix[$k * 6 + $l]) {
@@ -89,8 +107,7 @@ public function run()
                     ]);
                 }
             }
-            // Insert scenario_measure
-            $measures = Measure::all();
+            // Insert measure_scenario
             foreach ($measures as $l => $measure) {
                 if (1 === $measure_scenario_matrix[$k * 10 + $l]) {
                     DB::table('measure_scenario')->updateOrInsert([
diff --git a/deploy b/deploy
index 66db32530b70784534e16811a94ece44cf0acc17..8a21f69ac168e351a514217d10679a7ac30af50f 100755
--- a/deploy
+++ b/deploy
@@ -7,14 +7,16 @@ php8.1 artisan down
 # remove mix-manifest to prevent conflicts
 rm public/mix-manifest.json
 #pull latest code
+#git stash to prevent pull conflict
+git stash
 git pull
 
 ## Composer
-php8.1 /usr/bin/composer install --prefer-dist --no-interaction --optimize-autoloader
+php8.1 $(which composer) install --prefer-dist --no-interaction --optimize-autoloader || exit 1
 
 ## CSS & JS
-npm install
-npm run production
+npm install || exit 1
+npm run production || exit 1
 
 # Get correct version info from git tag and replace into template
 VERSION=$(git describe --tags)
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c557baea2b44e3393ab3b217d131d5a95de72641
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,85 @@
+# For more information: https://laravel.com/docs/sail
+version: '3'
+services:
+    laravel.test:
+        build:
+            context: ./vendor/laravel/sail/runtimes/8.1
+            dockerfile: Dockerfile
+            args:
+                WWWGROUP: '${WWWGROUP}'
+        image: sail-8.1/app
+        extra_hosts:
+            - 'host.docker.internal:host-gateway'
+        ports:
+            - '${APP_PORT:-80}:80'
+            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
+        environment:
+            WWWUSER: '${WWWUSER:-1000}'
+            WWGROUP: '${WWGROUP:-1000}'
+            LARAVEL_SAIL: 1
+            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
+            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
+        volumes:
+            - '.:/var/www/html'
+        networks:
+            - sail
+        depends_on:
+            - mysql
+            #            - redis
+            - mailhog
+    #            - selenium
+    mysql:
+        image: 'mysql/mysql-server:8.0'
+        ports:
+            - '${FORWARD_DB_PORT:-3306}:3306'
+        environment:
+            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
+            MYSQL_ROOT_HOST: "%"
+            MYSQL_DATABASE: '${DB_DATABASE}'
+            MYSQL_USER: '${DB_USERNAME}'
+            MYSQL_PASSWORD: '${DB_PASSWORD}'
+            MYSQL_ALLOW_EMPTY_PASSWORD: 1
+        volumes:
+            - 'sail-mysql:/var/lib/mysql'
+            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
+        networks:
+            - sail
+        healthcheck:
+            test: [ "CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}" ]
+            retries: 3
+            timeout: 5s
+    #    redis:
+    #        image: 'redis:alpine'
+    #        ports:
+    #            - '${FORWARD_REDIS_PORT:-6379}:6379'
+    #        volumes:
+    #            - 'sail-redis:/data'
+    #        networks:
+    #            - sail
+    #        healthcheck:
+    #            test: ["CMD", "redis-cli", "ping"]
+    #            retries: 3
+    #            timeout: 5s
+    mailhog:
+        image: 'mailhog/mailhog:latest'
+        ports:
+            - '${FORWARD_MAILHOG_PORT:-1025}:1025'
+            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
+        networks:
+            - sail
+#    selenium:
+#        image: 'selenium/standalone-chrome'
+#        extra_hosts:
+#            - 'host.docker.internal:host-gateway'
+#        volumes:
+#            - '/dev/shm:/dev/shm'
+#        networks:
+#            - sail
+networks:
+    sail:
+        driver: bridge
+volumes:
+    sail-mysql:
+        driver: local
+#    sail-redis:
+#        driver: local
diff --git a/lang/fr/exports.php b/lang/fr/exports.php
new file mode 100644
index 0000000000000000000000000000000000000000..537873832f78dabf2fd97369018ad7752686a28c
--- /dev/null
+++ b/lang/fr/exports.php
@@ -0,0 +1,115 @@
+<?php
+
+return [
+    'organization' => [
+        'name' => 'nom de la collectivité',
+        'shortName' => 'nom court',
+        'territory' => 'libellé territoire',
+        'type' => 'type de structure',
+        'insee' => 'insee',
+        'siren' => 'siren',
+        'active' => 'actif',
+        'website' => 'site internet',
+        'info' => 'infos complémentaire',
+        'fullAddress' => 'adresse',
+        'referent' => 'référent',
+        'referentElu' => 'référent élu',
+        'referentCyber' => 'référent cyber',
+        'lastEvaluation' => [
+            'cyberMaturity' => 'score indice maturité cyber',
+            'reference' => 'version du référentiel',
+            'updatedBy' => 'évaluation modifiée par',
+            'author' => 'évaluation crée  par',
+        ],
+        'previousEvaluation' => [
+            'cyberMaturity' => 'score indice maturité cyber n-1',
+        ],
+        'measure1' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 1',
+            'expectedLevel' => 'niveau de planification mesure 1',
+        ],
+        'measure2' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 2',
+            'expectedLevel' => 'niveau de planification mesure 2',
+        ],
+        'measure3' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 3',
+            'expectedLevel' => 'niveau de planification mesure 3',
+        ],
+        'measure4' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 4',
+            'expectedLevel' => 'niveau de planification mesure 4',
+        ],
+        'measure5' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 5',
+            'expectedLevel' => 'niveau de planification mesure 5',
+        ],
+        'measure6' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 6',
+            'expectedLevel' => 'niveau de planification mesure 6',
+        ],
+        'measure7' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 7',
+            'expectedLevel' => 'niveau de planification mesure 7',
+        ],
+        'measure8' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 8',
+            'expectedLevel' => 'niveau de planification mesure 8',
+        ],
+        'measure9' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 9',
+            'expectedLevel' => 'niveau de planification mesure 9',
+        ],
+        'measure10' => [
+            'actualLevel' => 'niveau de mise en Å“uvre mesure 10',
+            'expectedLevel' => 'niveau de planification mesure 10',
+        ],
+        'executionLevel' => "niveau d'exécution",
+        'createdDate' => 'date création de la collectivité',
+
+        'dangerLevel1' => 'perception du danger 1',
+        'dangerLevel2' => 'perception du danger 2',
+        'dangerLevel3' => 'perception du danger 3',
+        'dangerLevel4' => 'perception du danger 4',
+        'dangerLevel5' => 'perception du danger 5',
+        'dangerLevel6' => 'perception du danger 6',
+
+        'maturityLevel' => [
+            'knowledge' => 'niveau de connaissance',
+            'organization' => 'niveau de organisation',
+            'motivation' => 'niveau de motivation',
+        ],
+
+        'alert' => 'alerte seuil dépassé',
+    ],
+    'evaluation' => [
+        'organizationId' => 'Collectivité id',
+        'updatedDate' => 'Date de modification',
+        'updatedBy' => 'Modifié par',
+        'reference' => 'Référentiel',
+        'status' => 'Statut de l’évaluation',
+        'statusDangers' => 'Statut Dangers',
+        'dangerLevel_1' => 'Perception Danger 1',
+        'dangerLevel_2' => 'Perception Danger 2',
+        'dangerLevel_3' => 'Perception Danger 3',
+        'dangerLevel_4' => 'Perception Danger 4',
+        'dangerLevel_5' => 'Perception Danger 5',
+        'dangerLevel_6' => 'Perception Danger 6',
+        'q1' => 'Q1',
+        'q2' => 'Q2',
+        'q3' => 'Q3',
+        'q4' => 'Q4',
+        'q5' => 'Q5',
+        'q6' => 'Q6',
+        'q7' => 'Q7',
+        'q8' => 'Q8',
+        'q9' => 'Q9',
+        'q10' => 'Q10',
+        'actionPlan' => 'Plan d’action',
+        'motivation' => 'Motivation',
+        'execution' => 'Exection',
+        'fundamental' => 'Fondamentaux',
+        'organization' => 'Organisation',
+        'maturityCyber' => 'Indice de maturité',
+    ],
+];
diff --git a/package-lock.json b/package-lock.json
index f31e81d2c8885cda7040a3d771d57fe8456f71c6..79a160425aa3a819506f4da4ee49eb9292fef3c1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,12 +4,16 @@
     "requires": true,
     "packages": {
         "": {
+            "name": "madis-cyber",
             "dependencies": {
                 "@ckeditor/ckeditor5-build-classic": "^34.1.0",
                 "@ckeditor/ckeditor5-vue2": "^3.0.1",
                 "@fortawesome/fontawesome-free": "^5.15.4",
                 "chart.js": "^3.9.1",
+                "chartjs-plugin-stacked100": "^1.2.1",
                 "dotenv": "^16.0.1",
+                "leaflet": "^1.9.2",
+                "leaflet.markercluster": "^1.5.3",
                 "vue-chartjs": "^4.1.1",
                 "vue-property-decorator": "^9.1.2",
                 "vue-tables-2": "^2.3.5",
@@ -34,7 +38,7 @@
                 "lodash": "^4.17.19",
                 "moment": "^2.29.3",
                 "postcss": "^8.1.14",
-                "resolve-url-loader": "^3.1.2",
+                "resolve-url-loader": "^5.0.0",
                 "sass": "^1.32.11",
                 "sass-loader": "^11.0.1",
                 "vue": "^2.6.12",
@@ -3018,9 +3022,9 @@
             }
         },
         "node_modules/adjust-sourcemap-loader": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
-            "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
+            "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",
@@ -3100,16 +3104,6 @@
                 "uplot": "^1.6.7"
             }
         },
-        "node_modules/admin-lte/node_modules/@fortawesome/fontawesome-free": {
-            "version": "5.15.4",
-            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz",
-            "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==",
-            "dev": true,
-            "hasInstallScript": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
         "node_modules/admin-lte/node_modules/bootstrap": {
             "version": "4.6.1",
             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
@@ -3268,12 +3262,6 @@
             "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
             "dev": true
         },
-        "node_modules/arity-n": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
-            "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==",
-            "dev": true
-        },
         "node_modules/array-flatten": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
@@ -3383,18 +3371,6 @@
                 "node": ">= 4.0.0"
             }
         },
-        "node_modules/atob": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-            "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-            "dev": true,
-            "bin": {
-                "atob": "bin/atob.js"
-            },
-            "engines": {
-                "node": ">= 4.5.0"
-            }
-        },
         "node_modules/autoprefixer": {
             "version": "10.4.7",
             "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
@@ -3979,15 +3955,6 @@
                 "tslib": "^2.0.3"
             }
         },
-        "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,
-            "engines": {
-                "node": ">=6"
-            }
-        },
         "node_modules/caniuse-api": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -4080,6 +4047,14 @@
             "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
             "dev": true
         },
+        "node_modules/chartjs-plugin-stacked100": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/chartjs-plugin-stacked100/-/chartjs-plugin-stacked100-1.2.1.tgz",
+            "integrity": "sha512-6RIvM1gBSXVFTcYs1kkTzPVIzMgJtRO7KNADwHzcVqqQw7xKrIOZfGQ4fXGF8FZtQ26KzjqmNUllPgx4GhlMng==",
+            "dependencies": {
+                "chart.js": "^3.8.0"
+            }
+        },
         "node_modules/chokidar": {
             "version": "3.5.3",
             "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -4267,15 +4242,6 @@
             "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
             "dev": true
         },
-        "node_modules/compose-function": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
-            "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==",
-            "dev": true,
-            "dependencies": {
-                "arity-n": "^1.0.4"
-            }
-        },
         "node_modules/compressible": {
             "version": "2.0.18",
             "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -4602,18 +4568,6 @@
             "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
             "dev": true
         },
-        "node_modules/css": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
-            "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
-            "dev": true,
-            "dependencies": {
-                "inherits": "^2.0.3",
-                "source-map": "^0.6.1",
-                "source-map-resolve": "^0.5.2",
-                "urix": "^0.1.0"
-            }
-        },
         "node_modules/css-declaration-sorter": {
             "version": "6.2.2",
             "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz",
@@ -4828,16 +4782,6 @@
                 "node": ">=8.0.0"
             }
         },
-        "node_modules/d": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
-            "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
-            "dev": true,
-            "dependencies": {
-                "es5-ext": "^0.10.50",
-                "type": "^1.0.1"
-            }
-        },
         "node_modules/datatables.net": {
             "version": "1.12.1",
             "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz",
@@ -5168,15 +5112,6 @@
                 }
             }
         },
-        "node_modules/decode-uri-component": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-            "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10"
-            }
-        },
         "node_modules/deep-equal": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
@@ -5677,42 +5612,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/es5-ext": {
-            "version": "0.10.61",
-            "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
-            "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "es6-iterator": "^2.0.3",
-                "es6-symbol": "^3.1.3",
-                "next-tick": "^1.1.0"
-            },
-            "engines": {
-                "node": ">=0.10"
-            }
-        },
-        "node_modules/es6-iterator": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-            "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
-            "dev": true,
-            "dependencies": {
-                "d": "1",
-                "es5-ext": "^0.10.35",
-                "es6-symbol": "^3.1.1"
-            }
-        },
-        "node_modules/es6-symbol": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
-            "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
-            "dev": true,
-            "dependencies": {
-                "d": "^1.0.1",
-                "ext": "^1.1.2"
-            }
-        },
         "node_modules/escalade": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -6426,21 +6325,6 @@
                 }
             ]
         },
-        "node_modules/ext": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
-            "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
-            "dev": true,
-            "dependencies": {
-                "type": "^2.5.0"
-            }
-        },
-        "node_modules/ext/node_modules/type": {
-            "version": "2.6.0",
-            "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
-            "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==",
-            "dev": true
-        },
         "node_modules/fast-deep-equal": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -7467,9 +7351,9 @@
             }
         },
         "node_modules/img-loader/node_modules/json5": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
             "dev": true,
             "dependencies": {
                 "minimist": "^1.2.0"
@@ -7479,9 +7363,9 @@
             }
         },
         "node_modules/img-loader/node_modules/loader-utils": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-            "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+            "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
             "dev": true,
             "dependencies": {
                 "big.js": "^5.2.2",
@@ -8142,9 +8026,9 @@
             "dev": true
         },
         "node_modules/json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "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"
@@ -8288,6 +8172,19 @@
                 "node": ">=10"
             }
         },
+        "node_modules/leaflet": {
+            "version": "1.9.2",
+            "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.2.tgz",
+            "integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g=="
+        },
+        "node_modules/leaflet.markercluster": {
+            "version": "1.5.3",
+            "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz",
+            "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==",
+            "peerDependencies": {
+                "leaflet": "^1.3.1"
+            }
+        },
         "node_modules/levn": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -8354,9 +8251,9 @@
             }
         },
         "node_modules/loader-utils": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
-            "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+            "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",
@@ -8710,9 +8607,9 @@
             }
         },
         "node_modules/moment-timezone": {
-            "version": "0.5.34",
-            "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
-            "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
+            "version": "0.5.39",
+            "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.39.tgz",
+            "integrity": "sha512-hoB6suq4ISDj7BDgctiOy6zljBsdYT0++0ZzZm9rtxIvJhIbQ3nmbgSWe7dNFGurl6/7b1OUkHlmN9JWgXVz7w==",
             "dev": true,
             "dependencies": {
                 "moment": ">= 2.9.0"
@@ -8773,12 +8670,6 @@
             "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
             "dev": true
         },
-        "node_modules/next-tick": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
-            "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
-            "dev": true
-        },
         "node_modules/no-case": {
             "version": "3.0.4",
             "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -10407,168 +10298,20 @@
                 "node": ">=4"
             }
         },
-        "node_modules/resolve-url": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-            "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
-            "deprecated": "https://github.com/lydell/resolve-url#deprecated",
-            "dev": true
-        },
         "node_modules/resolve-url-loader": {
-            "version": "3.1.4",
-            "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz",
-            "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==",
-            "dev": true,
-            "dependencies": {
-                "adjust-sourcemap-loader": "3.0.0",
-                "camelcase": "5.3.1",
-                "compose-function": "3.0.3",
-                "convert-source-map": "1.7.0",
-                "es6-iterator": "2.0.3",
-                "loader-utils": "1.2.3",
-                "postcss": "7.0.36",
-                "rework": "1.0.1",
-                "rework-visit": "1.0.0",
-                "source-map": "0.6.1"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/resolve-url-loader/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/resolve-url-loader/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/resolve-url-loader/node_modules/chalk/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/resolve-url-loader/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/resolve-url-loader/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/resolve-url-loader/node_modules/convert-source-map": {
-            "version": "1.7.0",
-            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-            "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-            "dev": true,
-            "dependencies": {
-                "safe-buffer": "~5.1.1"
-            }
-        },
-        "node_modules/resolve-url-loader/node_modules/emojis-list": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-            "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==",
-            "dev": true,
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/resolve-url-loader/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/resolve-url-loader/node_modules/json5": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-            "dev": true,
-            "dependencies": {
-                "minimist": "^1.2.0"
-            },
-            "bin": {
-                "json5": "lib/cli.js"
-            }
-        },
-        "node_modules/resolve-url-loader/node_modules/loader-utils": {
-            "version": "1.2.3",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-            "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
-            "dev": true,
-            "dependencies": {
-                "big.js": "^5.2.2",
-                "emojis-list": "^2.0.0",
-                "json5": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/resolve-url-loader/node_modules/postcss": {
-            "version": "7.0.36",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
-            "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^2.4.2",
-                "source-map": "^0.6.1",
-                "supports-color": "^6.1.0"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/postcss/"
-            }
-        },
-        "node_modules/resolve-url-loader/node_modules/supports-color": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-            "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+            "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": {
-                "has-flag": "^3.0.0"
+                "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": ">=6"
+                "node": ">=12"
             }
         },
         "node_modules/restructure": {
@@ -10596,28 +10339,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/rework": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
-            "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==",
-            "dev": true,
-            "dependencies": {
-                "convert-source-map": "^0.3.3",
-                "css": "^2.0.0"
-            }
-        },
-        "node_modules/rework-visit": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
-            "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==",
-            "dev": true
-        },
-        "node_modules/rework/node_modules/convert-source-map": {
-            "version": "0.3.5",
-            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
-            "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==",
-            "dev": true
-        },
         "node_modules/rimraf": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -11067,20 +10788,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/source-map-resolve": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-            "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-            "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
-            "dev": true,
-            "dependencies": {
-                "atob": "^2.1.2",
-                "decode-uri-component": "^0.2.0",
-                "resolve-url": "^0.2.1",
-                "source-map-url": "^0.4.0",
-                "urix": "^0.1.0"
-            }
-        },
         "node_modules/source-map-support": {
             "version": "0.5.21",
             "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -11091,13 +10798,6 @@
                 "source-map": "^0.6.0"
             }
         },
-        "node_modules/source-map-url": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-            "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
-            "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
-            "dev": true
-        },
         "node_modules/sparklines": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/sparklines/-/sparklines-1.3.0.tgz",
@@ -11474,6 +11174,23 @@
                 "popper.js": "^1.16.1"
             }
         },
+        "node_modules/tempusdominus-core": {
+            "version": "5.19.3",
+            "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz",
+            "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==",
+            "dev": true,
+            "peer": true,
+            "dependencies": {
+                "jquery": "^3.6.0",
+                "moment": "~2.29.2",
+                "moment-timezone": "^0.5.34"
+            },
+            "peerDependencies": {
+                "jquery": "^3.0",
+                "moment": "^2.29.2",
+                "moment-timezone": "^0.5.0"
+            }
+        },
         "node_modules/terser": {
             "version": "5.14.2",
             "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
@@ -11638,9 +11355,9 @@
             }
         },
         "node_modules/tsconfig-paths/node_modules/json5": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
             "dev": true,
             "dependencies": {
                 "minimist": "^1.2.0"
@@ -11661,12 +11378,6 @@
             "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
             "dev": true
         },
-        "node_modules/type": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
-            "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
-            "dev": true
-        },
         "node_modules/type-check": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -11827,13 +11538,6 @@
                 "node": ">=6"
             }
         },
-        "node_modules/urix": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-            "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-            "deprecated": "Please see https://github.com/lydell/urix#deprecated",
-            "dev": true
-        },
         "node_modules/url": {
             "version": "0.11.0",
             "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
@@ -12010,9 +11714,9 @@
             }
         },
         "node_modules/vue-loader/node_modules/json5": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
             "dev": true,
             "dependencies": {
                 "minimist": "^1.2.0"
@@ -12022,9 +11726,9 @@
             }
         },
         "node_modules/vue-loader/node_modules/loader-utils": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-            "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+            "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
             "dev": true,
             "dependencies": {
                 "big.js": "^5.2.2",
@@ -12077,9 +11781,9 @@
             }
         },
         "node_modules/vue-style-loader/node_modules/json5": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-            "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
             "dev": true,
             "dependencies": {
                 "minimist": "^1.2.0"
@@ -12089,9 +11793,9 @@
             }
         },
         "node_modules/vue-style-loader/node_modules/loader-utils": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-            "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+            "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
             "dev": true,
             "dependencies": {
                 "big.js": "^5.2.2",
@@ -15061,9 +14765,9 @@
             "requires": {}
         },
         "adjust-sourcemap-loader": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
-            "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
+            "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,
             "requires": {
                 "loader-utils": "^2.0.0",
@@ -15139,12 +14843,6 @@
                 "uplot": "^1.6.7"
             },
             "dependencies": {
-                "@fortawesome/fontawesome-free": {
-                    "version": "5.15.4",
-                    "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz",
-                    "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==",
-                    "dev": true
-                },
                 "bootstrap": {
                     "version": "4.6.1",
                     "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
@@ -15261,12 +14959,6 @@
             "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
             "dev": true
         },
-        "arity-n": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
-            "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==",
-            "dev": true
-        },
         "array-flatten": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
@@ -15362,12 +15054,6 @@
             "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
             "dev": true
         },
-        "atob": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-            "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-            "dev": true
-        },
         "autoprefixer": {
             "version": "10.4.7",
             "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
@@ -15827,12 +15513,6 @@
                 "tslib": "^2.0.3"
             }
         },
-        "camelcase": {
-            "version": "5.3.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-            "dev": true
-        },
         "caniuse-api": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -15908,6 +15588,14 @@
                 "color-name": "^1.0.0"
             }
         },
+        "chartjs-plugin-stacked100": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/chartjs-plugin-stacked100/-/chartjs-plugin-stacked100-1.2.1.tgz",
+            "integrity": "sha512-6RIvM1gBSXVFTcYs1kkTzPVIzMgJtRO7KNADwHzcVqqQw7xKrIOZfGQ4fXGF8FZtQ26KzjqmNUllPgx4GhlMng==",
+            "requires": {
+                "chart.js": "^3.8.0"
+            }
+        },
         "chokidar": {
             "version": "3.5.3",
             "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -16057,15 +15745,6 @@
             "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
             "dev": true
         },
-        "compose-function": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
-            "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==",
-            "dev": true,
-            "requires": {
-                "arity-n": "^1.0.4"
-            }
-        },
         "compressible": {
             "version": "2.0.18",
             "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -16336,18 +16015,6 @@
             "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
             "dev": true
         },
-        "css": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
-            "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
-            "dev": true,
-            "requires": {
-                "inherits": "^2.0.3",
-                "source-map": "^0.6.1",
-                "source-map-resolve": "^0.5.2",
-                "urix": "^0.1.0"
-            }
-        },
         "css-declaration-sorter": {
             "version": "6.2.2",
             "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz",
@@ -16496,16 +16163,6 @@
                 "css-tree": "^1.1.2"
             }
         },
-        "d": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
-            "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
-            "dev": true,
-            "requires": {
-                "es5-ext": "^0.10.50",
-                "type": "^1.0.1"
-            }
-        },
         "datatables.net": {
             "version": "1.12.1",
             "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.12.1.tgz",
@@ -16828,12 +16485,6 @@
                 "ms": "2.1.2"
             }
         },
-        "decode-uri-component": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-            "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
-            "dev": true
-        },
         "deep-equal": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
@@ -17245,38 +16896,6 @@
                 "is-symbol": "^1.0.2"
             }
         },
-        "es5-ext": {
-            "version": "0.10.61",
-            "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
-            "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
-            "dev": true,
-            "requires": {
-                "es6-iterator": "^2.0.3",
-                "es6-symbol": "^3.1.3",
-                "next-tick": "^1.1.0"
-            }
-        },
-        "es6-iterator": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-            "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
-            "dev": true,
-            "requires": {
-                "d": "1",
-                "es5-ext": "^0.10.35",
-                "es6-symbol": "^3.1.1"
-            }
-        },
-        "es6-symbol": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
-            "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
-            "dev": true,
-            "requires": {
-                "d": "^1.0.1",
-                "ext": "^1.1.2"
-            }
-        },
         "escalade": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -17812,23 +17431,6 @@
                 }
             }
         },
-        "ext": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
-            "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
-            "dev": true,
-            "requires": {
-                "type": "^2.5.0"
-            },
-            "dependencies": {
-                "type": {
-                    "version": "2.6.0",
-                    "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
-                    "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==",
-                    "dev": true
-                }
-            }
-        },
         "fast-deep-equal": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -18601,18 +18203,18 @@
             },
             "dependencies": {
                 "json5": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+                    "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
                     "dev": true,
                     "requires": {
                         "minimist": "^1.2.0"
                     }
                 },
                 "loader-utils": {
-                    "version": "1.4.0",
-                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-                    "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+                    "version": "1.4.2",
+                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+                    "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
                     "dev": true,
                     "requires": {
                         "big.js": "^5.2.2",
@@ -19091,9 +18693,9 @@
             "dev": true
         },
         "json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
             "dev": true
         },
         "jsonfile": {
@@ -19202,6 +18804,17 @@
                 }
             }
         },
+        "leaflet": {
+            "version": "1.9.2",
+            "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.2.tgz",
+            "integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g=="
+        },
+        "leaflet.markercluster": {
+            "version": "1.5.3",
+            "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz",
+            "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==",
+            "requires": {}
+        },
         "levn": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -19258,9 +18871,9 @@
             "dev": true
         },
         "loader-utils": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
-            "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+            "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,
             "requires": {
                 "big.js": "^5.2.2",
@@ -19546,9 +19159,9 @@
             "dev": true
         },
         "moment-timezone": {
-            "version": "0.5.34",
-            "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
-            "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
+            "version": "0.5.39",
+            "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.39.tgz",
+            "integrity": "sha512-hoB6suq4ISDj7BDgctiOy6zljBsdYT0++0ZzZm9rtxIvJhIbQ3nmbgSWe7dNFGurl6/7b1OUkHlmN9JWgXVz7w==",
             "dev": true,
             "requires": {
                 "moment": ">= 2.9.0"
@@ -19594,12 +19207,6 @@
             "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
             "dev": true
         },
-        "next-tick": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
-            "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
-            "dev": true
-        },
         "no-case": {
             "version": "3.0.4",
             "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -20762,137 +20369,17 @@
             "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
             "dev": true
         },
-        "resolve-url": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-            "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
-            "dev": true
-        },
         "resolve-url-loader": {
-            "version": "3.1.4",
-            "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz",
-            "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==",
-            "dev": true,
-            "requires": {
-                "adjust-sourcemap-loader": "3.0.0",
-                "camelcase": "5.3.1",
-                "compose-function": "3.0.3",
-                "convert-source-map": "1.7.0",
-                "es6-iterator": "2.0.3",
-                "loader-utils": "1.2.3",
-                "postcss": "7.0.36",
-                "rework": "1.0.1",
-                "rework-visit": "1.0.0",
+            "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,
+            "requires": {
+                "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"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "3.2.1",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-                    "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^1.9.0"
-                    }
-                },
-                "chalk": {
-                    "version": "2.4.2",
-                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-                    "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-styles": "^3.2.1",
-                        "escape-string-regexp": "^1.0.5",
-                        "supports-color": "^5.3.0"
-                    },
-                    "dependencies": {
-                        "supports-color": {
-                            "version": "5.5.0",
-                            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-                            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-                            "dev": true,
-                            "requires": {
-                                "has-flag": "^3.0.0"
-                            }
-                        }
-                    }
-                },
-                "color-convert": {
-                    "version": "1.9.3",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-                    "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "1.1.3"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.3",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-                    "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-                    "dev": true
-                },
-                "convert-source-map": {
-                    "version": "1.7.0",
-                    "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-                    "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-                    "dev": true,
-                    "requires": {
-                        "safe-buffer": "~5.1.1"
-                    }
-                },
-                "emojis-list": {
-                    "version": "2.1.0",
-                    "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-                    "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==",
-                    "dev": true
-                },
-                "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
-                },
-                "json5": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-                    "dev": true,
-                    "requires": {
-                        "minimist": "^1.2.0"
-                    }
-                },
-                "loader-utils": {
-                    "version": "1.2.3",
-                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-                    "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
-                    "dev": true,
-                    "requires": {
-                        "big.js": "^5.2.2",
-                        "emojis-list": "^2.0.0",
-                        "json5": "^1.0.1"
-                    }
-                },
-                "postcss": {
-                    "version": "7.0.36",
-                    "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
-                    "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
-                    "dev": true,
-                    "requires": {
-                        "chalk": "^2.4.2",
-                        "source-map": "^0.6.1",
-                        "supports-color": "^6.1.0"
-                    }
-                },
-                "supports-color": {
-                    "version": "6.1.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-                    "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^3.0.0"
-                    }
-                }
             }
         },
         "restructure": {
@@ -20913,30 +20400,6 @@
             "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
             "dev": true
         },
-        "rework": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
-            "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==",
-            "dev": true,
-            "requires": {
-                "convert-source-map": "^0.3.3",
-                "css": "^2.0.0"
-            },
-            "dependencies": {
-                "convert-source-map": {
-                    "version": "0.3.5",
-                    "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
-                    "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==",
-                    "dev": true
-                }
-            }
-        },
-        "rework-visit": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
-            "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==",
-            "dev": true
-        },
         "rimraf": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -21284,19 +20747,6 @@
             "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
             "dev": true
         },
-        "source-map-resolve": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-            "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-            "dev": true,
-            "requires": {
-                "atob": "^2.1.2",
-                "decode-uri-component": "^0.2.0",
-                "resolve-url": "^0.2.1",
-                "source-map-url": "^0.4.0",
-                "urix": "^0.1.0"
-            }
-        },
         "source-map-support": {
             "version": "0.5.21",
             "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -21307,12 +20757,6 @@
                 "source-map": "^0.6.0"
             }
         },
-        "source-map-url": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
-            "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
-            "dev": true
-        },
         "sparklines": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/sparklines/-/sparklines-1.3.0.tgz",
@@ -21589,6 +21033,18 @@
                 }
             }
         },
+        "tempusdominus-core": {
+            "version": "5.19.3",
+            "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz",
+            "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==",
+            "dev": true,
+            "peer": true,
+            "requires": {
+                "jquery": "^3.6.0",
+                "moment": "~2.29.2",
+                "moment-timezone": "^0.5.34"
+            }
+        },
         "terser": {
             "version": "5.14.2",
             "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
@@ -21711,9 +21167,9 @@
             },
             "dependencies": {
                 "json5": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+                    "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
                     "dev": true,
                     "requires": {
                         "minimist": "^1.2.0"
@@ -21733,12 +21189,6 @@
             "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
             "dev": true
         },
-        "type": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
-            "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
-            "dev": true
-        },
         "type-check": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -21867,12 +21317,6 @@
                 }
             }
         },
-        "urix": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-            "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-            "dev": true
-        },
         "url": {
             "version": "0.11.0",
             "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
@@ -22014,18 +21458,18 @@
             },
             "dependencies": {
                 "json5": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+                    "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
                     "dev": true,
                     "requires": {
                         "minimist": "^1.2.0"
                     }
                 },
                 "loader-utils": {
-                    "version": "1.4.0",
-                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-                    "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+                    "version": "1.4.2",
+                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+                    "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
                     "dev": true,
                     "requires": {
                         "big.js": "^5.2.2",
@@ -22076,18 +21520,18 @@
             },
             "dependencies": {
                 "json5": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-                    "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+                    "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
                     "dev": true,
                     "requires": {
                         "minimist": "^1.2.0"
                     }
                 },
                 "loader-utils": {
-                    "version": "1.4.0",
-                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-                    "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+                    "version": "1.4.2",
+                    "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+                    "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
                     "dev": true,
                     "requires": {
                         "big.js": "^5.2.2",
diff --git a/package.json b/package.json
index 94ddafd937d6ea892ee2c905576d2624646011c7..b468b80baf2bee503386fff940e94895da35f9d1 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
         "lodash": "^4.17.19",
         "moment": "^2.29.3",
         "postcss": "^8.1.14",
-        "resolve-url-loader": "^3.1.2",
+        "resolve-url-loader": "^5.0.0",
         "sass": "^1.32.11",
         "sass-loader": "^11.0.1",
         "vue": "^2.6.12",
@@ -42,7 +42,10 @@
         "@ckeditor/ckeditor5-vue2": "^3.0.1",
         "@fortawesome/fontawesome-free": "^5.15.4",
         "chart.js": "^3.9.1",
+        "chartjs-plugin-stacked100": "^1.2.1",
         "dotenv": "^16.0.1",
+        "leaflet": "^1.9.2",
+        "leaflet.markercluster": "^1.5.3",
         "vue-chartjs": "^4.1.1",
         "vue-property-decorator": "^9.1.2",
         "vue-tables-2": "^2.3.5",
diff --git a/public/index.php b/public/index.php
index 1d69f3a2890599c4f51f93e1906f44d64f5eb928..f3c2ebcd377cfedff027f7cf01595d895fdc5221 100644
--- a/public/index.php
+++ b/public/index.php
@@ -16,7 +16,7 @@
 |
 */
 
-if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
+if (file_exists($maintenance = __DIR__ . '/../storage/framework/maintenance.php')) {
     require $maintenance;
 }
 
@@ -31,7 +31,7 @@
 |
 */
 
-require __DIR__.'/../vendor/autoload.php';
+require __DIR__ . '/../vendor/autoload.php';
 
 /*
 |--------------------------------------------------------------------------
@@ -44,7 +44,7 @@
 |
 */
 
-$app = require_once __DIR__.'/../bootstrap/app.php';
+$app = require_once __DIR__ . '/../bootstrap/app.php';
 
 $kernel = $app->make(Kernel::class);
 
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index 8a2170b072c7eedebddeef49fec6b4ea21716452..c0737e976e79c3b1407a139d8435b16b4689c43d 100644
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -2,12 +2,15 @@
     "/js/app.js": "/js/app.js",
     "/css/app.css": "/css/app.css",
     "/images/logo-soluris.png": "/images/logo-soluris.png",
+    "/images/logoblancetorange.png": "/images/logoblancetorange.png",
     "/images/logo_madis_2020_blanc.png": "/images/logo_madis_2020_blanc.png",
     "/images/logo_madis_2020_couleur.png": "/images/logo_madis_2020_couleur.png",
     "/images/logo_madis_2020_favicon.png": "/images/logo_madis_2020_favicon.png",
     "/images/logo_madis_2020_favicon_white.png": "/images/logo_madis_2020_favicon_white.png",
     "/images/logo_madis_cyber.png": "/images/logo_madis_cyber.png",
-    "/images/logoblancetorange.png": "/images/logoblancetorange.png",
     "/images/rectangle.png": "/images/rectangle.png",
-    "/images/soluris-logo-white.png": "/images/soluris-logo-white.png"
+    "/images/soluris-logo-white.png": "/images/soluris-logo-white.png",
+    "/images/vendor/leaflet/dist/layers-2x.png": "/images/vendor/leaflet/dist/layers-2x.png",
+    "/images/vendor/leaflet/dist/layers.png": "/images/vendor/leaflet/dist/layers.png",
+    "/images/vendor/leaflet/dist/marker-icon.png": "/images/vendor/leaflet/dist/marker-icon.png"
 }
diff --git a/resources/js/app.js b/resources/js/app.js
index 918746fd906f4aafe950818a6a007b0d31273360..743499be3bde59431da2740abf9b03604a0e9330 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -22,6 +22,7 @@ import stores from './stores'
 require('./bootstrap')
 
 Vue.prototype.$reference = window.referentielVersion
+Vue.prototype.$seuilAlerte = window.seuilAlerte
 Vue.prototype.$footerLink = window.footerLink
 Vue.prototype.$logoSidebar = window.logoSidebar
 Vue.prototype.$appVersion = window.appVersion
diff --git a/resources/js/components/App.vue b/resources/js/components/App.vue
index 83ffcee9aa009ad1e4e2a336435535d3a43dd8f0..086d59a1e821ae89c793ac0ba35b3dfe59690d0f 100644
--- a/resources/js/components/App.vue
+++ b/resources/js/components/App.vue
@@ -93,11 +93,11 @@
             <i class="fas fa-spinner fa-spin" />
         </div>
 
-        <div class="main-footer bg-primary">
-            <b>© 2018 <a :href="$footerLink" class="text-white text-decoration-underline">SOLURIS</a></b>
+        <div :class="footerClass()">
+            <b>© {{ footer_year }} <a :href='footer_link' class="text-white text-decoration-underline" target="_blank" >{{ footer_name }}</a></b>
             <span v-if="user && user.organization">: {{ user.organization.name }}</span>
 
-            <div class="float-right d-none d-sm-inline-block">
+            <div class="float-right d-sm-inline-block">
                 <router-link to="/credits" class="text-white text-decoration-underline">Crédits</router-link> | {{$appVersion}}
             </div>
         </div>
@@ -121,7 +121,10 @@ export default {
             isManager,
             isUser,
             collapsed: false,
-            closed: false
+            closed: false,
+            footer_name: process.env.MIX_FOOTER_NAME,
+            footer_link: process.env.MIX_FOOTER_LINK,
+            footer_year: process.env.MIX_FOOTER_YEAR,
         }
     },
     computed: {
@@ -166,9 +169,16 @@ export default {
                 this.$store.dispatch('revertUser')
             } else {
                 this.$store.dispatch('logout')
-                window.location.href = '/login'
             }
         },
+        footerClass(){
+            if (this.$route.path === '/login'){
+                return 'main-footer bg-primary login-footer'
+            }
+            else {
+                return 'main-footer bg-primary'
+            }
+        }
     }
 }
 </script>
diff --git a/resources/js/components/Auth/Login.vue b/resources/js/components/Auth/Login.vue
index aa29ca479cc26975b88bc9f16825db32821e7ac7..9833ad5092b5fb2603df194dfbc2ed1c88b073a3 100644
--- a/resources/js/components/Auth/Login.vue
+++ b/resources/js/components/Auth/Login.vue
@@ -1,10 +1,10 @@
 <template>
-    <div class="login-page">
+    <div class="login-page" >
         <div class="login-box">
             <div class="card">
                 <div
                     class="login-logo"
-                    style="background-color: #395B64"
+                    style="background-color: #28285B"
                 >
                     <img
                         class="fit-picture"
@@ -77,7 +77,7 @@
                             @close="userModalOpen=false"
                         />
                         <div class="row mt-4 pt-2 mb-2">
-                            <div class="col-7">
+                            <div class="col-6 pr-0">
                                 <div
                                     class="icheck-primary"
                                     data-children-count="1"
@@ -92,10 +92,11 @@
                                     </label>
                                 </div>
                             </div>
-                            <div class="col-5">
+                            <div class="col-6">
                                 <button
                                     type="submit"
                                     class="btn btn-primary btn-block btn-flat"
+                                    style="white-space: nowrap;"
                                     :disabled="sending"
                                 >
                                     <i
@@ -159,3 +160,10 @@ export default {
     }
 }
 </script>
+<style>
+    .login-footer{
+        position: fixed;
+        bottom:0px;
+        width:100%;
+    }
+</style>
diff --git a/resources/js/components/Credits/index.vue b/resources/js/components/Credits/index.vue
index d2653e643b36d8bb283072dc50b55e6afabbaad1..6c45c211fe3939cb97f5971cdf306e8847dea00e 100644
--- a/resources/js/components/Credits/index.vue
+++ b/resources/js/components/Credits/index.vue
@@ -25,7 +25,7 @@
                     <li>Alexandre GROSMY, Contributeur (<a class="link-info text-decoration-none" href="mailto:a.grosmy@soluris.fr">a.grosmy@soluris.fr</a>)</li>
                 </ul>
                 <p class="mb-0"> Contributeurs :
-                    Soluris, ANSSI, GIP <a class="link-info text-decoration-none" href="https://www.cybermalveillance.gouv.fr" target="_blank">Cybermalveillance.gouv.fr</a>, Adico, CDG47, eCollectivités
+                    Soluris, ANSSI, GIP, Adico, CDG47, eCollectivités
                 </p>
                 <p>Financeurs : Soluris, France Relance</p>
 
@@ -37,6 +37,8 @@
                     <li>Laurent PLAINECASSAGNE Directeur (<a class="link-info text-decoration-none" href="mailto:plainecassagne@datakode.fr">plainecassagne@datakode.fr</a>)</li>
                     <li>Guillaume BOUCHARD Chef de projet (<a class="link-info text-decoration-none" href="mailto:bouchard@datakode.fr">bouchard@datakode.fr</a>)</li>
                     <li>Jonathan FOUCHER Développement &amp; maintenance (<a class="link-info text-decoration-none" href="mailto:foucher@datakode.fr">foucher@datakode.fr</a>)</li>
+                    <li>Aurore CHAYROUSE Développement &amp; maintenance (<a class="link-info text-decoration-none" href="mailto:chayrouse@datakode.fr">chayrouse@datakode.fr</a>)</li>
+                    <li>Sébastien DUPUY Développement &amp; maintenance (<a class="link-info text-decoration-none" href="mailto:dupuy@datakode.fr">dupuy@datakode.fr</a>)</li>
                 </ul>
                 <p></p>
 
diff --git a/resources/js/components/Dashboard/AdminView/Components/ActionTerritory.vue b/resources/js/components/Dashboard/AdminView/Components/ActionTerritory.vue
new file mode 100644
index 0000000000000000000000000000000000000000..284cd1b627290ddbf9a3318a134947e9ad08c685
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/ActionTerritory.vue
@@ -0,0 +1,74 @@
+<template>
+    <div class="card py-3 px-2">
+        <div class="card-title mb-3"> Actions par territoire</div>
+        <Bar v-if="chartData" :chart-data="chartData" :chart-options="options" />
+    </div>
+</template>
+
+<script>
+import {Bar} from 'vue-chartjs/legacy'
+import { Chart as ChartJS, Title, Tooltip, Legend, RadialLinearScale, registerables} from 'chart.js'
+import axios from "axios";
+
+ChartJS.register(Title, Tooltip, Legend, RadialLinearScale, ...registerables)
+
+/* COUNT AVERAGE ACTION PLANNED & ACTION DONE PER TERRITORY. */
+export default {
+    name: 'ActionTerritory',
+    components: {
+        Bar,
+    },
+    data () {
+        return {
+            chartData : {},
+            options: {
+                indexAxis: 'y',
+                responsive: true,
+                maintainAspectRatio: false,
+                plugins: {
+                    legend: {
+                    },
+                },
+                layout: {
+                    padding: 0,
+                },
+                scales: {
+                    x: {
+                        grid: {
+                            drawBorder: false,
+                        },
+                        ticks : {
+                            // display: false,
+                        }
+                    },
+                    y: {
+                        grid: {
+                            drawBorder: false,
+                        },
+                        ticks : {
+                            // display:false,
+                        }
+                    }
+                }
+            },
+        }
+    },
+    mounted () {
+        this.getActivesOrganizations()
+    },
+    methods: {
+        async getActivesOrganizations () {
+            await axios.get(`/api/graphs/actionterritory`)
+                .then( res => { // data : [ [0,0,0], [0,0,0] ] , labels : []
+
+                    const datasets = res.data.data.map( (d, i) => ({ data : d, backgroundColor : i === 1 ? '#00c6c3' : '#ff327b', label : i === 1 ? "Nombre moyen d'actions prévues" : "Nombre moyen d'actions réalisées" }))
+
+                    this.chartData = {
+                        labels : res.data.labels,
+                        datasets
+                    }
+                })
+        },
+    }
+}
+</script>
diff --git a/resources/js/components/Dashboard/AdminView/Components/Exports.vue b/resources/js/components/Dashboard/AdminView/Components/Exports.vue
new file mode 100644
index 0000000000000000000000000000000000000000..422a08b4873337ba9ff4f30562d5975128e1165a
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/Exports.vue
@@ -0,0 +1,37 @@
+<template>
+    <div class="row">
+        <div class="col-md-6">
+            <div class="card">
+                <div class="card-body">Exporter les évaluations</div>
+                <a href="/export/evaluations.xlsx">
+                    <div class="card-footer bg-primary p-1 text-center">
+                        Exporter <i class="fas fa-arrow-circle-right"></i>
+                    </div>
+                </a>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <div class="card">
+                <div class="card-body ">Exporter les structures</div>
+
+                <a href="/export/structures.xlsx">
+                    <div class="card-footer bg-primary p-1 text-center">
+                        Exporter <i class="fas fa-arrow-circle-right"></i>
+                    </div>
+                </a>
+
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'Export',
+    props: [],
+    data() {
+        return {}
+    },
+    computed: {}
+}
+</script>
diff --git a/resources/js/components/Dashboard/AdminView/Components/MaturityCyberByTerritory.vue b/resources/js/components/Dashboard/AdminView/Components/MaturityCyberByTerritory.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8ff47379af0ce755dacc8c205b08aa7803f4646d
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/MaturityCyberByTerritory.vue
@@ -0,0 +1,176 @@
+<template>
+    <div class="card">
+        <div class="card flex-row bg-primary mb-0">
+            <div class="card-body col-10">
+                <div class="card-text">
+                    <div class="font-weight-bold h4 m-0">{{ getAverageMaturityCyber() }}</div>
+                    Indice de maturité cyber moyen des structures
+                </div>
+            </div>
+            <div class="col-2">
+                <i class="fas fa-chart-line" style="font-size: 50px;"></i>
+            </div>
+        </div>
+        <div class="card-body">
+            <PolarArea  :chart-data="chartData" :chart-options="options" />
+            <div class="row">
+                <div v-for="t in territories" :key="t.id" :class="`col-mt-4 mt-4 ${territories.length > 1 ? 'border-right' : ''}`">
+                    <b>{{ t.name }}</b> <br/>
+                    <small>Indice de maturité cyber</small> <br/>
+                    <span v-if="t.organizations.length"> {{ Math.round(t.current_maturity_cyber * 10)/10 }}</span> <span v-else>-</span>
+                    <div class="progress progress-xs">
+                        <div class="progress-bar bg-success" role="progressbar" :style="{ 'width' : `${t.current_maturity_cyber / 3 * 100}%`}" aria-valuemin="0" aria-valuemax="100"></div>
+                    </div>
+
+                    <!-- SHOW % -->
+                    <div v-if="isFinite(getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber))">
+                        <div v-if="getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber) === 0" class="mt-1 text-info">
+                            <i class="fas fa-equals"></i> <small> {{ getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber) }} %</small>
+                        </div>
+                        <div v-else-if="getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber) > 0" class="mt-1 text-success">
+                            <i class="fas fa-arrow-up"></i> <small>+ {{ getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber) }} %</small>
+                        </div>
+                        <div v-else class="mt-1 text-danger">
+                            <i class="fas fa-arrow-down"></i> <small> {{ getEvolutionMaturityCyber(t.current_maturity_cyber, t.previous_maturity_cyber) }} %</small>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+/* Pour tous les territoires
+Récupérer les structures actives
+Pour chaque structures > récupérer la dernière evaluation et l'avant dernière
+Pour chaque evaluation > récupérer l'indice de maturité de la derniere et avant derniere eval.
+
+ */
+import { PolarArea } from 'vue-chartjs/legacy'
+import { Chart as ChartJS, Title, Tooltip, Legend, RadialLinearScale, registerables} from 'chart.js'
+
+ChartJS.register(Title, Tooltip, Legend, RadialLinearScale, ...registerables)
+
+export default {
+    name: 'MaturityCyberCard',
+    components: {
+        PolarArea,
+    },
+    props : [],
+    data () {
+        return {
+            options: {
+                plugins: {
+                    legend: {
+                        // display: false
+                        position: 'bottom',
+                    },
+                },
+                responsive: true,
+                scales: {
+                    r: {
+                        min: 0,
+                        max: 3,
+                        ticks: {
+                            color: '#000',
+                            backdropColor: 'rgba(255,255,255, 0.5)',
+                            z: 10,
+                            callback: function (value) { if (Number.isInteger(value)) { return value; } },
+                        },
+                        pointLabels: {
+                            display: true,
+                            centerPointLabels: true,
+                            font: {
+                                size: 12
+                            }
+                        }
+                    }
+                }
+            },
+        }
+    },
+    computed: {
+        evaluations () {
+            return this.$store.state.evaluations.all
+        },
+        chartData() {
+            const labels = this.territories.map(t => t.name)
+            const data = this.territories.map(t => t.current_maturity_cyber);
+            const colors = labels.map((c, i) => {
+                return 'hsla('+ 360*i/labels.length +', 100%, 60%, 0.8)'
+            })
+            return {
+                labels,
+                datasets: [
+                    {
+                        data,
+                        backgroundColor: colors
+                    }
+                ]
+            }
+        },
+        territories () {
+            // GET EVALUATIONS PER ORGA IN TERRITORY TO REACH MATURITY CYBER INDICE
+            const territories = this.$store.state.territories.all.map( territory => (
+                {...territory,
+                    organizations : territory.organizations
+                        .map( org => ({...org,
+                            evaluations : this.evaluations.filter( e => e.organization_id === org.id)
+                                .filter( e => e.status === 2)
+                                .sort( (a,b) => new Date(b.updated_at) - new Date(a.updated_at))
+                        }))
+                        .filter(org => org.active)
+                }
+            ))
+            // SET MATURITY CYBER INDICE TO ORG
+            return territories.map( territory => (
+                {...territory,
+                    organizations : territory.organizations.map( org => ({...org,
+                        current_maturity_cyber : org.evaluations[0] && org.evaluations[0].maturity_cyber,
+                        previous_maturity_cyber : org.evaluations[1] && org.evaluations[1].maturity_cyber,
+                    })
+                    )
+                }
+            // SET ARRAY OF MC INDICE IN TERRITORY THEN CALC AVERAGE MATURITY CYBER
+            )).map( territory => ({...territory,
+                current_maturity_cyber : territory.organizations.map(org => org.current_maturity_cyber).filter(mc => mc).reduce((partialSum, a) => partialSum + a, 0) / territory.organizations.length,
+                previous_maturity_cyber : territory.organizations.map(org => org.previous_maturity_cyber).filter(mc => mc).reduce((partialSum, a) => partialSum + a, 0) / territory.organizations.length,
+            }
+            ))
+        },
+
+    },
+    watch : {
+    },
+    mounted () {
+    },
+    methods : {
+        getEvolutionMaturityCyber (newMC, oldMC) {
+            const pourcent = (newMC - oldMC) / oldMC * 100
+            return Math.sign(pourcent) * Math.round(Math.abs(pourcent)) || 0
+        },
+        getAverageMaturityCyber () {
+            const data = []
+            this.territories.forEach( t => t.organizations.forEach(org => {
+                if (org.active) {
+                    data.push(org.current_maturity_cyber || 0)
+                }
+            }))
+            console.log('data', data)
+            return (data.reduce((partialSum, a) => partialSum + a, 0) / data.length).toFixed(2)
+        }
+    },
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/AdminView/Components/MaturityCyberMap.vue b/resources/js/components/Dashboard/AdminView/Components/MaturityCyberMap.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7f34111f6654b6db60677ef963aef1d2a43c91c3
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/MaturityCyberMap.vue
@@ -0,0 +1,158 @@
+<template>
+    <div class="card py-3 px-2">
+        <div class="card-title mb-3">Cartographie de la maturité cyber</div>
+
+        <select v-model="measureFilter" class="form-control form-control-sm mb-3">
+            <option value="">Toutes les mesures de sécurité fondamentales</option>
+            <option v-for="m in fundamentalMeasures" :key="m.id" :value="m.id">{{m.short_name}}</option>
+        </select>
+
+        <div class="row">
+            <div class='my-2 col-md-6 text-right' :style= "[disabledFilter.includes('green') ? {'text-decoration':'line-through'} : {'text-decoration':''}]" @click="stripetext('green')">
+                <div class="mr-2 d-inline-block" style="height: 15px; width: 35px; background-color: green;"></div><span class="text-muted small">En règle</span>
+            </div>
+            <div class='my-2 col-md-6 text-left' :style= "[disabledFilter.includes('red') ? {'text-decoration':'line-through'} : {'text-decoration':''}]" @click="stripetext('red')">
+                <div class="mr-2 d-inline-block" style="height: 15px; width: 35px; background-color: red;"></div><span class="text-muted small">En alerte</span>
+            </div>
+        </div>
+
+        <div id="map"></div>
+
+    </div>
+</template>
+
+<script>
+import L from 'leaflet';
+
+import 'leaflet.markercluster';
+import 'leaflet.markercluster/dist/MarkerCluster.Default.css'
+
+export default {
+    name: 'MaturityCyberMap',
+    props : [],
+    data () {
+        return {
+            seuilAlerte : parseInt(this.$seuilAlerte),
+
+            map : null,
+            markerClusterGroup : null,
+            array_positions : [],
+            measureFilter : "",
+            disabledFilter : [],
+
+        }
+    },
+    computed: {
+        measures () {
+            return this.$store.state.measures.all
+        },
+        evaluations () {
+            return this.$store.state.evaluations.all
+        },
+        fundamentalMeasuresId () {
+            return this.fundamentalMeasures.map(m => m.id)
+        },
+        fundamentalMeasures () {
+            return this.$store.state.measures.all.filter( m => m.fundamental)
+        },
+        organizations () {
+            const orgs = this.$store.state.organizations.all.filter(org => org.active).map( org => {
+                const evaluations = this.evaluations.filter( e => e.organization_id === org.id)
+                    .filter( e => e.status === 2)
+                    .sort( (a,b) => new Date(b.updated_at) - new Date(a.updated_at))
+
+
+                const getInsideSeuilAlerte = evaluations.length ? evaluations[0].measure_levels.filter( ml => this.fundamentalMeasuresId.includes(ml.measure_id)).filter( ml => ml.actual_level <= this.seuilAlerte) : []
+                return {...org, evaluations, seuilAlert : getInsideSeuilAlerte}
+            })
+
+            return orgs .filter( org => this.disabledFilter.length ? this.disabledFilter.length > 1 ? false : this.disabledFilter.includes('red') ? !org.seuilAlert.length : this.disabledFilter.includes('green') ? org.seuilAlert.length : true : true)
+                .filter( org => this.measureFilter ? org.seuilAlert.find(a => a.measure_id === this.measureFilter) : true)
+        },
+
+    },
+    watch : {
+        organizations () {
+            this.initMarkers()
+        }
+    },
+    mounted () {
+        this.initMap()
+    },
+    methods : {
+        stripetext(id){
+            if (this.disabledFilter.includes(id)) {
+                this.disabledFilter = this.disabledFilter.filter(f => f !== id)
+            } else {
+                this.disabledFilter.push(id)
+            }
+        },
+        initMap () {
+            this.map = L.map('map') 
+            L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
+                // zoom: 5,
+                // center: [46.9, 1.9],
+                maxZoom: 19,
+            }).addTo(this.map);
+            this.map.setView([46.9, 1.9], 5); // FRANCE BOUNDS
+            this.map.options.maxZoom = 14;
+            this.map.options.zoomSnap = 0.1;
+            this.map.attributionControl.setPrefix('')
+            this.initMarkers()
+        },
+        initMarkers () {
+            this.markerClusterGroup && this.map.removeLayer(this.markerClusterGroup)
+            this.markerClusterGroup = L.markerClusterGroup({
+                maxClusterRadius: function() { return 30; }
+            });
+
+            this.array_positions = [];
+
+            this.organizations.forEach( org => {
+
+                if (org.evaluations.length) { // Cette carte affiche un point par structure ayant au moins une évaluation
+
+                    const color = org.seuilAlert.length ? "red" : "green"
+
+                    const style = { radius: 5, fillColor: color, fillOpacity: 1, color, organization: org} 
+                    const latlng = org.address && org.address.lat && org.address.lng? [parseFloat(org.address.lat), parseFloat(org.address.lng)] : []
+
+                    if (latlng.length) {
+                        const measureText = org.seuilAlert.map(a => a.measure.short_name)
+                        const alertText = org.seuilAlert.length ? "<br/><i><small>Mesures de sécurité fondamentales en alerte :</small></i> " + measureText.join(', ') : ""
+
+                        this.markerClusterGroup.addLayer(L.circleMarker(latlng, style)
+                            .bindPopup(`
+<b>${org.name}</b> <br> 
+<i><small>Indice de maturité cyber : </small></i>${org.evaluations[0].maturity_cyber} 
+${alertText}`)
+
+                            .on('mouseover', function() {
+                                this.openPopup()})
+                            .on('mouseout', function() {
+                                this.closePopup();
+                            })
+                        )
+                        this.array_positions.push(latlng);
+                    }
+                }
+            })
+            this.map.addLayer(this.markerClusterGroup);
+            this.array_positions.length && this.map.fitBounds(this.array_positions, {padding: [30, 30]})
+        },
+    },
+}
+</script>
+<style scoped>
+#map {
+    height: 400px;
+}
+.vertical-center {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+}
+.text-muted {
+    letter-spacing: -0.5px;
+}
+</style>
diff --git a/resources/js/components/Dashboard/AdminView/Components/MeasurePlanned.vue b/resources/js/components/Dashboard/AdminView/Components/MeasurePlanned.vue
new file mode 100644
index 0000000000000000000000000000000000000000..606feec2ccecdbb1c5b561a05f09156da8a1e7b7
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/MeasurePlanned.vue
@@ -0,0 +1,94 @@
+<template>
+    <div class="card py-3 px-2">
+        <div class="card-title mb-3"> Top 3 des niveaux de mesures de sécurité planifiées</div>
+
+        <select v-model="chooseTerritoryId" class="form-control form-control-sm mb-3">
+            <option value="">Tous les territoires</option>
+            <option v-for="t in selectTerritories" :key="t.id" :value="t.id">{{t.name}}</option>
+        </select>
+        <div v-if="favoriteMeasures && favoriteMeasures.length && !loading">
+            <div v-for="(measure, i) in favoriteMeasures" :key="measure.measure_id" class="card flex-row">
+                <div class="col-2 bg-primary font-weight-bold">
+                    <span style="font-size: 50px;">{{ i + 1 }}</span>
+                </div>
+                <div class="card-body col-10 py-2">
+                    <div class="card-text">
+                        {{ measure.short_name }}
+                        <div class="small font-weight-bold">Niveau {{ measure.max_levels[0] }}</div>
+                    </div>
+                    <div class="progress progress-xs my-1">
+                        <div
+                            class="progress-bar"
+                            :class="measure.max_levels[0] === 1 ? 'bg-danger' : measure.max_levels[0] === 2 ? 'bg-info' : measure.max_levels[0] === 3 ? 'bg-success' : 'black'"
+                            role="progressbar"
+                            :style="{width: measure.max_levels[0] === 1 ? '33%' :  measure.max_levels[0] === 2 ? '66%' : measure.max_levels[0] === 3 ? '100%' : '0%'}"
+                            aria-valuemin="0" aria-valuemax="100"></div>
+                    </div>
+                    <div v-if="organizationsNumber" class="card-text">
+                        <!-- if float -> tofixed(2) -->
+                        {{ measure.percentage.toFixed(2) }} % des structures
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div v-else-if="loading" class="text-center ">
+            <i class="fas fa-spinner fa-spin" style="font-size: 3em"></i>
+        </div>
+        <div v-else class="text-center small">Aucune mesure</div>
+    </div>
+</template>
+
+<script>
+/* nombre de niveau de mesures de sécurité mis en œuvre /30)*100 */
+
+export default {
+    name: 'MeasureCard',
+    props : [],
+    data () {
+        return {
+            chooseTerritoryId : "",
+            loading: false,
+        }
+    },
+    computed: {
+        measures () {
+            return this.$store.state.measures.all
+        },
+        evaluations () {
+            return this.$store.state.evaluations.all
+        },
+        selectTerritories () {
+            return this.$store.state.territories.all
+        },
+        organizationsNumber() {
+            return this.$store.state.graphs.organization && this.$store.state.graphs.organization.organization ? this.$store.state.graphs.organization.organization.count : null
+
+        },
+        favoriteMeasures () {
+            console.log('this.$store.state.graphs.organization', this.$store.state.graphs.organization)
+            return this.$store.state.graphs.organization && this.$store.state.graphs.organization.organization ? this.$store.state.graphs.organization.organization.top_measures : null
+        }
+    },
+    watch: {
+        chooseTerritoryId(newValue) {
+            this.loading = true
+            this.$store.dispatch('getOrganizationData', {territoryId: newValue}).then(() => {
+                this.loading = false;
+            })
+        }
+    },
+    mounted() {
+        this.$store.dispatch('getOrganizationData', {territoryId: null})
+    }
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/AdminView/Components/MeasuresInAction.vue b/resources/js/components/Dashboard/AdminView/Components/MeasuresInAction.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ad13634283da4f1e69a7b04c2040a8dcd420f514
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/MeasuresInAction.vue
@@ -0,0 +1,113 @@
+<template>
+    <div class="card py-3 px-2">
+        <div class="card-title mb-3">Mesures de sécurité retenues dans les plans d'actions</div>
+        <Bar v-if="chartData"  :chart-data="chartData" :chart-options="options" /> <!--  :height="180"  -->
+    </div>
+</template>
+
+<script>
+import {Bar} from 'vue-chartjs/legacy'
+import ChartjsPluginStacked100 from "chartjs-plugin-stacked100";
+import { Chart as ChartJS, Title, Tooltip, Legend, RadialLinearScale, registerables} from 'chart.js'
+
+ChartJS.register(ChartjsPluginStacked100, Title, Tooltip, Legend, RadialLinearScale, ...registerables)
+
+export default {
+    name: 'MeasuresInAction',
+    components : {
+        Bar,
+    },
+    data () {
+        return {
+            data1 : [],
+            data2 : [],
+            data3 : [],
+
+            options: {
+                indexAxis: 'y',
+                // responsive: false,
+                // maintainAspectRatio: false,
+                plugins: {
+                    stacked100 : {
+                        enable : true,
+                    },
+                    legend: {
+                    },
+                },
+                layout: {
+                    padding: 0,
+                },
+                scales: {
+                    y: {
+                        grid: {
+                            drawBorder: false,
+                        },
+                        stacked: true,
+                    },
+                    x: {
+                        grid: {
+                            drawBorder: false,
+                        },
+                        stacked: true,
+                    },
+                    yAxes: [{
+                        barThickness: 4, // number (pixels) or 'flex'
+                        maxBarThickness: 5 // number (pixels)
+                    }]
+                }
+            },
+        }
+    },
+    computed: {
+        evaluations () {
+            return this.$store.state.evaluations.all 
+        },
+        organizations () {
+            return this.$store.state.organizations.all
+                .map( org => ({...org, 
+                    evaluations : this.evaluations.filter( e => e.organization_id === org.id)
+                        .filter( e => e.status === 2)
+                        .sort( (a,b) => new Date(b.updated_at) - new Date(a.updated_at)) ,
+                }))
+                .filter(org => org.active)
+        },
+        chartData() {
+            // niveaux de mesures planifiés en moyenne dans les plan d’actions des structures actives
+            // Dans chaque Organisation active > Prendre la dernière evaluation > 
+            // Regarder les measures_levels, mettre la measure id 1 à la première place du tableau correspondant au expected_level de la measure.
+            const labels = this.$store.state.measures.all.map( m => m.short_name)
+
+            this.organizations.forEach(org => {
+                const currentEvaluation = org.evaluations[0]
+                currentEvaluation && currentEvaluation.measure_levels.forEach( ml => {
+                    if (ml.expected_level) {
+                        this[`data${ml.expected_level}`][ml.measure_id -1] = this[`data${ml.expected_level}`][ml.measure_id -1] ? this[`data${ml.expected_level}`][ml.measure_id -1] +1 : 1
+                    }
+                })
+            })
+
+
+            return {
+                labels,
+                datasets: [
+                    {
+                        label: 'Niveau 1',
+                        backgroundColor: '#ff327b',
+                        data: this.data1
+                    },
+                    {
+                        label: 'Niveau 2',
+                        backgroundColor: '#0698ed',
+                        data: this.data2
+                    },
+                    {
+                        label: 'Niveau 3',
+                        backgroundColor: '#00c6c3',
+                        data: this.data3
+                    },
+                ]
+            }
+        }
+    }
+}
+</script>
\ No newline at end of file
diff --git a/resources/js/components/Dashboard/AdminView/Components/OrganizationsAlert.vue b/resources/js/components/Dashboard/AdminView/Components/OrganizationsAlert.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4655297cdf6c717c4090f1f2d6de6a042d6cf6f7
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/OrganizationsAlert.vue
@@ -0,0 +1,126 @@
+<template>
+    <div class="card">
+        <div class="card flex-row bg-primary mb-0">
+            <div class="card-body col-10">
+                <div class="card-text">
+                    <div class="font-weight-bold h4 m-0">{{ organizationsAlert.length }}</div>
+                    Structures en alerte dépassement de seuil
+                </div>
+            </div>
+            <div class="col-2">
+                <i class="fas fa-exclamation-circle" style="font-size: 50px;"></i>
+            </div>
+        </div>
+        <div class="card-body px-5">
+            <Doughnut v-if="chartData" :chart-data="chartData" :chart-options="options" />
+        </div>
+    </div>
+</template>
+
+<script>
+/*
+GET FUNDAMENTAL MEASURES (value 1)
+IF THIS MEASURE LEVEL IS LOWER THAN seuilAlerte   >   “Seuil d’alerte dépassée = true”.
+IF seuilAlerte == -1   >   SKIP
+ */
+import { Doughnut } from 'vue-chartjs/legacy'
+import { Chart as ChartJS, Title, Tooltip, Legend, registerables} from 'chart.js'
+
+ChartJS.register(Title, Tooltip, Legend, ...registerables)
+
+
+export default {
+    name: 'OrganizationsAlert',
+    components: {
+        Doughnut,
+    },
+    props : [],
+    data () {
+        return {
+            seuilAlerte : parseInt(this.$seuilAlerte),
+
+            options: {
+                maintainAspectRatio: false,
+                plugins: {
+                    legend: {
+                        position: 'right',
+                        labels : {
+                            color : '#6b6b6b',
+                            font: {
+                                size : 16,
+                            }
+                        }
+                    },
+                },
+            },
+        }
+    },
+    computed: {
+        fundamentalMeasures () {
+            return this.$store.state.measures.all.filter( m => m.fundamental)
+        },
+        evaluations () {
+            return this.$store.state.evaluations.all
+        },
+        territories () {
+            return this.$store.state.territories.all.map( territory => (
+                {...territory,
+                    organizations : territory.organizations
+                        .map( org => ({...org,
+                            evaluations : this.evaluations.filter( e => e.organization_id === org.id)
+                                .filter( e => e.status === 2)
+                                .sort( (a,b) => new Date(b.updated_at) - new Date(a.updated_at)) ,
+                        }))
+                        .filter(org => org.active)
+                })
+            )
+        },
+        organizationsAlert () {
+            const fundamentalMeasuresId = this.fundamentalMeasures.map(m => m.id)
+
+            const organizations = this.territories.map( t => t.organizations)
+            return [].concat.apply([], organizations)
+                .filter( org => {
+                    if (org.evaluations.length) {
+                        const getInsideSeuilAlerte = org.evaluations[0].measure_levels
+                            .filter( ml => fundamentalMeasuresId.includes(ml.measure_id)) // CHECK IF MEASURE IS FUNDAMENTAL
+                            .filter( ml => ml.actual_level <= this.seuilAlerte) // THEN CHECK IF IN SEUIL ALERTE
+                        return getInsideSeuilAlerte.length
+                    }
+                    return false
+                })
+        },
+        chartData() {
+            if (this.territories) {
+                const labels = this.territories.map( t => t.name);
+                const data = this.territories.map( t => t.organizations.filter( org => this.organizationsAlert.map(o => o.id).includes(org.id)).length);
+                const colors = labels.map((c, i) => {
+                    return 'hsla('+ 360*i/labels.length +', 100%, 60%, 0.6)'
+                })
+                return {
+                    labels,
+                    datasets: [
+                        {
+                            data,
+                            backgroundColor: colors
+
+                        }
+                    ]
+                }
+            }
+            return {}
+        },
+    }
+}
+</script>
+
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/AdminView/Components/OrganizationsGraph.vue b/resources/js/components/Dashboard/AdminView/Components/OrganizationsGraph.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cba77fd9d5ae3ba296f6958de906e4a9b534a4ca
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/Components/OrganizationsGraph.vue
@@ -0,0 +1,94 @@
+<template>
+    <div class="card">
+        <div class="card flex-row bg-primary mb-0">
+            <div class="card-body col-10">
+                <div class="card-text">
+                    <div class="font-weight-bold h4 m-0">{{ activeOrganizations.length }}</div>
+                    Structures actives
+                </div>
+            </div>
+            <div class="col-2">
+                <i class="fas fa-home" style="font-size: 50px;"></i>
+            </div>
+        </div>
+        <div class="card-body px-5">
+            <Doughnut v-if="chartData" :chart-data="chartData" :chart-options="options" />
+        </div>
+    </div>
+</template>
+
+<script>
+import { Doughnut } from 'vue-chartjs/legacy'
+import { Chart as ChartJS, Title, Tooltip, Legend, registerables} from 'chart.js'
+
+ChartJS.register(Title, Tooltip, Legend, ...registerables)
+
+
+export default {
+    name: 'OrganizationsGraph',
+    components: {
+        Doughnut,
+    },
+    props : [],
+    data () {
+        return {
+            options: {
+                maintainAspectRatio: false,
+                plugins: {
+                    legend: {
+                        position: 'right',
+                        labels : {
+                            color : '#6b6b6b',
+                            font: {
+                                size : 16,
+                                // weight : 'bold',
+                            }
+                        }
+                    },
+                },
+            },
+        }
+    },
+    computed: {
+        territories () {
+            return this.$store.state.territories.all
+        },
+        activeOrganizations () {
+            const organizations = this.territories.map( t => t.organizations.filter(org => org.active))
+            return [].concat.apply([], organizations)
+        },
+        chartData() {
+            if (this.territories) {
+                const labels = this.territories.map( t => t.name);
+                const data = this.territories.map( t => t.organizations.filter(org => org.active).length);
+
+                const colors = labels.map((c, i) => {
+                    return 'hsla('+ 360*i/labels.length +', 100%, 60%, 0.6)'
+                })
+
+                return {
+                    labels,
+                    datasets: [
+                        {
+                            data,
+                            backgroundColor: colors
+                        }
+                    ]
+                }
+            }
+            return {}
+        },
+    }
+}
+</script>
+
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/AdminView/index.vue b/resources/js/components/Dashboard/AdminView/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0067945207c719120e0471ef2c1d491403b181bf
--- /dev/null
+++ b/resources/js/components/Dashboard/AdminView/index.vue
@@ -0,0 +1,62 @@
+<template>
+    <div class="row" style="max-width: 1200px;margin: 0 auto">
+        <div class="col-md-6">
+            <div class="row">
+                <div class="col-md-12">
+                    <OrganizationsGraph />
+                </div>
+                <div class="col-md-12">
+                    <MaturityCyberMap />
+                </div>
+                <div class="col-md-12">
+                    <ActionTerritory />
+                </div>
+                <div class="col-md-12">
+                    <MeasuresInAction />
+                </div>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <div class="row">
+                <div class="col-md-12">
+                    <OrganizationsAlert />
+                </div>
+                <div class="col-md-12">
+                    <Exports/>
+                </div>
+                <div class="col-md-12">
+                    <MaturityCyberByTerritory />
+                </div>
+                <div class="col-md-12">
+                    <MeasurePlanned />
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+    name: 'AdminView',
+    components : {
+        OrganizationsGraph: () => import('./Components/OrganizationsGraph.vue'),
+        MaturityCyberMap: () => import('./Components/MaturityCyberMap.vue'),
+        ActionTerritory: () => import('./Components/ActionTerritory.vue'),
+        MeasuresInAction: () => import('./Components/MeasuresInAction.vue'),
+        OrganizationsAlert: () => import('./Components/OrganizationsAlert.vue'),
+        Exports: () => import('./Components/Exports.vue'),
+        MaturityCyberByTerritory: () => import('./Components/MaturityCyberByTerritory.vue'),
+        MeasurePlanned: () => import('./Components/MeasurePlanned.vue'),
+    },
+    data () {
+        return {
+        }
+    },
+    computed: {
+        user () {
+            return this.$store.state.user
+        },
+    }
+}
+</script>
diff --git a/resources/js/components/Dashboard/ManagerView/Components/ActionPlanTable.vue b/resources/js/components/Dashboard/ManagerView/Components/ActionPlanTable.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3249f677a6e713c0b603d91263fb92916154f424
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/ActionPlanTable.vue
@@ -0,0 +1,53 @@
+<template>
+    <div class="card">
+        <div class="card-body">
+            <h5 class="card-title mb-3">Plan d'action</h5>
+            <table class="table table-bordered table-responsive">
+                <thead>
+                    <tr>
+                        <th>Actions à réaliser</th>
+                        <th>Date limite de mise en oeuvre</th>
+                        <th>Personne en charge</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr v-if="!actions || !actions.length">
+                        <td colspan="3">Aucune action</td>
+                    </tr>
+                    <tr v-for="item in actions" :key="item.id">
+                        <td>{{ item.level.actual_label }}</td>
+                        <td>{{ item.end_date }}</td>
+                        <td>{{ item.manager }}</td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</template>
+
+<script>
+import moment from 'moment'
+
+export default {
+    name: 'ActionPlanTable',
+    props : ['currentEvaluation'],
+    data () {
+        return {
+        }
+    },
+    computed: {
+        measures () {
+            return this.$store.state.measures.all
+        },
+        actions () {
+            return this.currentEvaluation && this.currentEvaluation.measure_levels
+                .filter(level => level.expected_level > level.actual_level)
+                .map( level => ({...level,
+                    level : this.measures.find(m => m.id === level.measure_id).levels.find(l => l.level === level.expected_level) ,
+                    end_date : moment(level.end_date).format('DD/MM/YYYY')
+                }
+                ))
+        }
+    }
+}
+</script>
diff --git a/resources/js/components/Dashboard/ManagerView/Components/ActionsDoneCard.vue b/resources/js/components/Dashboard/ManagerView/Components/ActionsDoneCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b51cf2988c3f8013dd6aab10e9643e758f7c7ac0
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/ActionsDoneCard.vue
@@ -0,0 +1,57 @@
+<template>
+    <div v-if="plannedMeasures && plannedMeasures.length > 0" class="col-md-6">
+        <div class="card flex-row">
+            <div class="col-4 bg-primary">
+                <i class="fas fa-crosshairs" style="font-size: 50px;"></i>
+            </div>
+            <div class="card-body col-8">
+                <div class="card-text">
+                    Actions réalisées <br />
+                    <div class="small font-weight-bold">{{ doneMeasures ? doneMeasures.length : 0 }} sur {{ plannedMeasures ? plannedMeasures.length : 0 }}</div>
+                </div>
+                <div class="progress progress-xs">
+                    <div class="progress-bar bg-success" role="progressbar" :style="{ 'width' : `${plannedMeasures && doneMeasures ? doneMeasures.length / plannedMeasures.length * 100 : 0}%`}" aria-valuemin="0" aria-valuemax="100"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+/* 2 : nombre de niveaux de mesure mises en place qui avait précédemment été planifiés dans l’évalution précédente
+4 : nombre de mesures planifiées dans l’évaluation précédente */
+export default {
+    name: 'ActionsDoneCard',
+    props : ['currentEvaluation', 'previousEvaluation'],
+    data () {
+        return {
+        }
+    },
+    computed: {
+        plannedMeasures () {
+            return this.previousEvaluation && this.previousEvaluation.measure_levels.filter(measure => measure.expected_level > measure.actual_level)
+        },
+        doneMeasures () {
+            // Compare lastLevel with currentLevel to know if currentLevel if better
+            if (this.currentEvaluation && this.plannedMeasures) {
+                return this.currentEvaluation.measure_levels
+                    .filter(currentLevel => {
+                        const lastLevel = this.plannedMeasures.find(ml => ml.measure_id === currentLevel.measure_id)
+                        return lastLevel ? currentLevel.actual_level >= lastLevel.expected_level : false
+                    })
+            }
+            return []
+        }
+    }
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/ManagerView/Components/AverageMaturityCyberCard.vue b/resources/js/components/Dashboard/ManagerView/Components/AverageMaturityCyberCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6acad177d0a9f4519122e0256e13be5eef8b4416
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/AverageMaturityCyberCard.vue
@@ -0,0 +1,37 @@
+<template>
+    <div class="card flex-row bg-primary">
+        <div class="card-body col-8">
+            <div class="card-text">
+                <div v-if="organizations" class="font-weight-bold h4 m-0">{{ organizations.maturity.toFixed(2) }}</div>
+                Indice de maturité cyber moyen des structures
+            </div>
+        </div>
+        <div class="col-4">
+            <i class="fas fa-chart-line" style="font-size: 50px;"></i>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+    name: 'AverageMaturityCyberCard',
+    props : ['organizations'],
+    data () {
+        return {
+        }
+    },
+    computed: {
+    }
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
\ No newline at end of file
diff --git a/resources/js/components/Dashboard/ManagerView/Components/MaturityCyberCard.vue b/resources/js/components/Dashboard/ManagerView/Components/MaturityCyberCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a15345ef15f8e3b6c254589d609fc5d77d34223b
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/MaturityCyberCard.vue
@@ -0,0 +1,94 @@
+<template>
+    <div class="card flex-row">
+        <div class="col-4 bg-primary">
+            <i class="fas fa-chart-line" style="font-size: 50px;"></i>
+        </div>
+        <div class="card-body col-8">
+            <div class="card-text">
+                Indice de maturité cyber
+                <div class="small font-weight-bold">{{ averageCurrentMaturityCyber.toLocaleString('fr') }} / 3</div>
+            </div>
+            <div class="progress progress-xs">
+                <div
+                    v-if="averageCurrentMaturityCyber" class="progress-bar bg-success"
+                    role="progressbar" :style="{ 'width' : `${averageCurrentMaturityCyber / 3 * 100}%`}"
+                    aria-valuemin="0"
+                    aria-valuemax="100"></div>
+                <div v-else class="progress-bar bg-success" role="progressbar" aria-valuemin="0" aria-valuemax="100"></div>
+            </div>
+            <div v-if="isFinite(evolutionMaturityCyber)">
+                <div v-if="evolutionMaturityCyber === 0" class="mt-1 text-info">
+                    <i class="fas fa-equals"></i> <small> {{ evolutionMaturityCyber }} %</small>
+                </div>
+                <div v-else-if="evolutionMaturityCyber && evolutionMaturityCyber > 0" class="mt-1 text-success">
+                    <i class="fas fa-arrow-up"></i> <small>+ {{ evolutionMaturityCyber }} %</small>
+                </div>
+                <div v-else-if="evolutionMaturityCyber" class="mt-1 text-danger">
+                    <i class="fas fa-arrow-down"></i> <small> {{ evolutionMaturityCyber }} %</small>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from 'axios'
+
+export default {
+    name: 'MaturityCyberCard',
+    props : ['currentEvaluation', 'previousEvaluation'],
+    data () {
+        return {
+            averageCurrentMaturityCyber : 0,
+            averagePreviousMaturityCyber : 0,
+        }
+    },
+    computed: {
+        // TE REMOVE
+        plannedMeasures () {
+            return this.previousEvaluation && this.previousEvaluation.measure_levels.filter(measure => measure.expected_level > measure.actual_level)
+        },
+        evolutionMaturityCyber () {
+            const pourcent = (this.averageCurrentMaturityCyber - this.averagePreviousMaturityCyber) / this.averagePreviousMaturityCyber * 100
+            return Math.sign(pourcent) * Math.round(Math.abs(pourcent))
+        }
+
+    },
+    watch : {
+        currentEvaluation () {
+            this.getAverageCurrentMaturityCyber()
+        },
+        previousEvaluation () {
+            this.getAveragePreviousMaturityCyber()
+        },
+    },
+    mounted () {
+        this.currentEvaluation && this.getAverageCurrentMaturityCyber()
+        this.previousEvaluation && this.getAveragePreviousMaturityCyber()
+    },
+    methods : {
+        async getAverageCurrentMaturityCyber () {
+            await axios.get(`/api/evaluations/${this.currentEvaluation.id}/graphs/maturity`)
+                .then( res => {
+                    this.averageCurrentMaturityCyber = res.data.data.reduce((a, b) => a + b, 0) / res.data.data.length
+                })
+        },
+        async getAveragePreviousMaturityCyber () {
+            await axios.get(`/api/evaluations/${this.previousEvaluation.id}/graphs/maturity`)
+                .then( res => {
+                    this.averagePreviousMaturityCyber = res.data.data.reduce((a, b) => a + b, 0) / res.data.data.length
+                })
+        },
+    },
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
diff --git a/resources/js/components/Dashboard/ManagerView/Components/MeasureCard.vue b/resources/js/components/Dashboard/ManagerView/Components/MeasureCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..98e86b5412a07eebdd0476b10a4966e97b94d80e
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/MeasureCard.vue
@@ -0,0 +1,44 @@
+<template>
+    <div class="card flex-row">
+        <div class="col-4 bg-primary">
+            <i class="fas fa-shield-alt" style="font-size: 50px;"></i>
+        </div>
+        <div class="card-body col-8 py-2">
+            <div class="card-text">
+                Mise en oeuvre des mesures de sécurité
+                <div v-if="totalMeasuresLevel" class="small font-weight-bold">{{ Math.round(totalMeasuresLevel / 30 * 100) }} %</div>
+                <div v-else class="small font-weight-bold">0 %</div>
+            </div>
+            <div class="progress progress-xs">
+                <div class="progress-bar bg-success" role="progressbar" :style="{ 'width' : `${totalMeasuresLevel ? totalMeasuresLevel / 30 * 100 : 0}%`}" aria-valuemin="0" aria-valuemax="100"></div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+/* nombre de niveau de mesures de sécurité mis en œuvre /30)*100 */
+export default {
+    name: 'MeasureCard',
+    props : ['currentEvaluation'],
+    data () {
+        return {
+        }
+    },
+    computed: {
+        totalMeasuresLevel () {
+            return this.currentEvaluation && this.currentEvaluation.measure_levels.map(level => level.actual_level).reduce((partialSum, a) => partialSum + a, 0);
+        }
+    }
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
\ No newline at end of file
diff --git a/resources/js/components/Dashboard/ManagerView/Components/MeasurePlanned.vue b/resources/js/components/Dashboard/ManagerView/Components/MeasurePlanned.vue
new file mode 100644
index 0000000000000000000000000000000000000000..43b27dac96a97e5860af9aeadb536d41585de2e1
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/MeasurePlanned.vue
@@ -0,0 +1,68 @@
+<template>
+    <div v-if="favoriteMeasures" class="card py-3 px-2">
+        <div class="card-title mb-3"> Top 3 des niveaux de mesures de sécurité planifiées</div>
+
+        <div v-for="(ml, i) in favoriteMeasures" :key="i" class="card flex-row"> 
+            <div class="col-2 bg-primary font-weight-bold">
+                <span style="font-size: 50px;">{{ i + 1 }}</span>
+            </div>
+            <div class="card-body col-10 py-2">
+                <div class="card-text">
+                    {{ ml.short_name }}
+                    <div class="small font-weight-bold">Niveau {{ ml.max_levels }}</div>
+                </div>
+                <div class="progress progress-xs my-1">
+                    <div
+                        class="progress-bar bg-success" role="progressbar"
+                        :style="{width: ml.max_levels == 1 ? '33%' :  ml.max_levels  == 2 ? '66%' : ml.max_levels  == 3 ? '100%' : '0%'}" 
+                        :class="ml.max_levels == 1 ? 'bg-danger' : ml.max_levels == 2 ? 'bg-info' : ml.max_levels == 3 ? 'bg-success' : 'black'" 
+                        aria-valuemin="0" aria-valuemax="100">
+                    </div>
+                </div>
+                <div class="card-text">
+                    {{ ml.percentage % 1 === 0 ? ml.percentage : ml.percentage.toFixed(2)}} % des structures
+                </div>
+            </div>
+        </div>
+        <div v-if="!favoriteMeasures.length" class="text-center small">Aucune mesure</div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'MeasureCard',
+    props : ['organizations'],
+    data () {
+        return {
+        }
+    },
+    computed: {
+        // top-measures déjà ordonné par max_value -> pas besoin de sort
+        favoriteMeasures () {
+            const favoriteMeasures = []
+            this.organizations && this.organizations.top_measures.forEach(ml => {
+                if (ml.max_levels.length > 1) {
+                    ml.max_levels.forEach( lvl => {
+                        favoriteMeasures.push({...ml, max_levels : lvl})
+                    })
+                } else {
+                    favoriteMeasures.push({...ml, max_levels : ml.max_levels[0]})
+                }
+            })
+
+            return favoriteMeasures.slice(0, 3)
+        }
+
+    }
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
\ No newline at end of file
diff --git a/resources/js/components/Dashboard/ManagerView/Components/OrganizationsCard.vue b/resources/js/components/Dashboard/ManagerView/Components/OrganizationsCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..073c99322332cf626d4cab741c4fe65c89f0c32c
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/Components/OrganizationsCard.vue
@@ -0,0 +1,35 @@
+<template>
+    <div class="card flex-row bg-primary">
+        <div class="card-body col-8">
+            <div class="card-text">
+                <div v-if="organizations" class="font-weight-bold h4 m-0">{{ organizations.count }}</div>
+                Structures évaluées
+            </div>
+        </div>
+        <div class="col-4">
+            <i class="fas fa-home" style="font-size: 50px;"></i>
+        </div>
+    </div>
+</template>
+
+<script>
+
+export default {
+    name: 'StructuresEvalueesCard',
+    props : ['organizations'],
+    data () {
+        return {
+        }
+    },
+}
+</script>
+<style scoped>
+.card.flex-row {
+    height: 120px;
+}
+.bg-primary {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+</style>
\ No newline at end of file
diff --git a/resources/js/components/Dashboard/ManagerView/index.vue b/resources/js/components/Dashboard/ManagerView/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..020377311f0a406c8ce8fed4c0ef691fb1e698de
--- /dev/null
+++ b/resources/js/components/Dashboard/ManagerView/index.vue
@@ -0,0 +1,86 @@
+<template>
+    <div class="row" style="max-width: 1200px;margin: 0 auto">
+        <div class="col-md-6">
+            <div class="row">
+
+                <ActionsDoneCard :current-evaluation="currentEvaluation" :previous-evaluation="previousEvaluation"/>
+                <div class="col-md-6">
+                    <MeasureCard :current-evaluation="currentEvaluation" />
+                </div>
+                <div class="col-md-6">
+                    <MaturiteCyberCard :current-evaluation="currentEvaluation" :previous-evaluation="previousEvaluation" />
+                </div>
+                <div class="col-md-12">
+                    <ActionPlanTable :current-evaluation="currentEvaluation" />
+                </div>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <div class="row">
+                <div class="col-md-6">
+                    <OrganizationsCard :organizations="organizations" />
+                </div>
+                <div class="col-md-6">
+                    <AverageMaturityCyberCard :organizations="organizations" />
+                </div>
+                <div class="col-md-12">
+                    <MeasurePlanned :organizations="organizations" />
+                </div>
+                <div class="col-md-12">
+                    <ActionTerritory />
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+
+import axios from "axios";
+
+export default {
+    name: 'DashboardManager',
+    components : {
+        ActionsDoneCard: () => import('./Components/ActionsDoneCard.vue'),
+        MeasureCard: () => import('./Components/MeasureCard.vue'),
+        MaturiteCyberCard: () => import('./Components/MaturityCyberCard.vue'),
+        OrganizationsCard: () => import('./Components/OrganizationsCard.vue'),
+        AverageMaturityCyberCard: () => import('./Components/AverageMaturityCyberCard.vue'),
+        ActionPlanTable: () => import('./Components/ActionPlanTable.vue'),
+        MeasurePlanned: () => import('./Components/MeasurePlanned.vue'),
+        ActionTerritory: () => import('../AdminView/Components/ActionTerritory.vue'),
+    },
+    data () {
+        return {
+            organizations : null
+        }
+    },
+    computed: {
+        user () {
+            return this.$store.state.user
+        },
+        evaluations () {
+            const evals = this.$store.state.evaluations.all
+            return evals.filter( e => e.status === 2).sort( (a,b) => new Date(b.updated_at) - new Date(a.updated_at))
+        },
+        currentEvaluation () {
+            return this.evaluations[0]
+        },
+        previousEvaluation () {
+            return this.evaluations[1]
+        },
+
+    },
+    mounted () {
+        this.getActivesOrganizations()
+    },
+    methods : {
+        async getActivesOrganizations () {
+            await axios.get(`/api/graphs/organizations`)
+                .then( res => {
+                    this.organizations = res.data
+                })
+        },
+    },
+}
+</script>
diff --git a/resources/js/components/Dashboard/index.vue b/resources/js/components/Dashboard/index.vue
index 8db2dea95de7ac0db462c50c43f4756b1ba1b68a..fb89899f7b82a96d5815e0274b55de7ac8788a15 100644
--- a/resources/js/components/Dashboard/index.vue
+++ b/resources/js/components/Dashboard/index.vue
@@ -1,12 +1,26 @@
 <template>
-    <div class="container">
-        En construction
+    <div class="mb-5 mx-5 mt-0">
+        <AdminView v-if="isAdmin()"/>
+        <ManagerView v-else/>
     </div>
 </template>
 
 <script>
+import { isAdmin } from '../../utils/permissions'
+import AdminView from './AdminView'
+import ManagerView from './ManagerView'
+
 export default {
     name: 'Dashboard',
+    components : {
+        AdminView,
+        ManagerView,
+    },
+    data () {
+        return {
+            isAdmin,
+        }
+    },
     computed: {
         user () {
             return this.$store.state.user
diff --git a/resources/js/components/Evaluations/List.vue b/resources/js/components/Evaluations/List.vue
index b454c098d6dc234d3a504b7e8a8dac053aae57ba..3e07e611670fc02c042efc99a013c481dba79301 100644
--- a/resources/js/components/Evaluations/List.vue
+++ b/resources/js/components/Evaluations/List.vue
@@ -131,21 +131,22 @@
                             class="btn btn-light btn-xs"
                         ><i class="fas fa-chart-bar" /> Résultats</router-link>
                         <button
-                            v-if="!isUser()"
+                            v-if="!isUser() && !nextCompletedEvaluation(props.row)"
                             class="btn btn-light btn-xs"
                             @click.prevent="editRow(props.row)"
                         ><i class="fas fa-pen" /> Modifier</button>
                     </span>
 
-                    <button
-                        v-else
+                    <a
+                        v-else-if="props.row.status === 2"
                         class="btn btn-light btn-xs"
-                        @click.prevent="downloadPdf(props.row)"
+                        :href="`/pdf/dossierCyberSecurite/${props.row.organization_id}/${props.row.id}`"
+                        target="_blank"
                     >
                         <i class="fas fa-clipboard-list" /> Rapport
-                    </button>
+                    </a>
                     <button
-                        v-if="!isUser()"
+                        v-if="!isUser() && !nextCompletedEvaluation(props.row)"
                         class="btn btn-light btn-xs"
                         @click="deleteRow(props.row)"
                     >
@@ -296,6 +297,7 @@ export default {
         user () {
             return this.$store.state.user
         },
+
         evaluations () {
             return this.$store.state.evaluations.all
                 .map(u => {
@@ -347,6 +349,16 @@ export default {
         },
     },
     methods: {
+        nextCompletedEvaluation (evaluation) {
+            return this.$store.state.evaluations.all.find(e => {
+                return e.organization_id === evaluation.organization_id
+                && e.status === 2
+                && new Date(e.updated_at) > new Date(evaluation.updated_at)
+                && e.reference === this.$reference
+                && evaluation.reference === this.$reference
+                && e.id !== evaluation.id
+            })
+        },
         resetFilters () {
             try {
                 this.dateRange.startDate = null
@@ -396,9 +408,6 @@ export default {
             if (confirm(`Souhaitez-vous supprimer l'évaluation du ${item.updated_at.format('DD/MM/YYYY')} ?`)) {
                 this.$store.dispatch('deleteEvaluation', item)
             }
-        },
-        downloadPdf(item) {
-            alert('Fonctionnalité en attente');
         }
     }
 }
diff --git a/resources/js/components/Evaluations/Single/Components/Buttons.vue b/resources/js/components/Evaluations/Single/Components/Buttons.vue
index db75ab5c289dd8e668a138e1f5fba25e5b7d6db4..3d756877109e77ee3d6e4a70d5a4a6b83278b61f 100644
--- a/resources/js/components/Evaluations/Single/Components/Buttons.vue
+++ b/resources/js/components/Evaluations/Single/Components/Buttons.vue
@@ -101,7 +101,7 @@ export default {
             this.$store.dispatch('getAllGraphsForEvaluation', this.evaluation.id)
 
             this.drafting = false
-            //this.$router.push('/evaluations')
+            // this.$router.push('/evaluations')
         },
         async next () {
             this.saving = true
@@ -155,6 +155,7 @@ export default {
 
                 // remove graph data from store
                 this.$store.commit('removeGraphData', {id: this.evaluation.id})
+                this.$store.dispatch('getAllGraphsForEvaluation', this.evaluation.id)
             }
         }
     }
diff --git a/resources/js/components/Evaluations/Single/Components/MeasureLevelCircle.vue b/resources/js/components/Evaluations/Single/Components/MeasureLevelCircle.vue
index a064dc5376ae68325c14b268592e0637d8f6a2c5..ffbe546115ff1d1e4fc1ac86c0acaaa91700671b 100644
--- a/resources/js/components/Evaluations/Single/Components/MeasureLevelCircle.vue
+++ b/resources/js/components/Evaluations/Single/Components/MeasureLevelCircle.vue
@@ -5,19 +5,23 @@
 
             <span class="text-muted text-uppercase small">Niveau</span>  <br/>
             <span class="h1">{{level}}</span>
-            <span v-if="expectedLevel > level">
+            <span v-if="expectedLevel > level && !nextLevel">
                 <i id="circle-arrow" class="fas fa-angle-double-right"></i>
                 <span class="h1">{{expectedLevel}}</span>
             </span>
+            <span v-if="nextLevel && nextLevel > level">
+                <i id="circle-arrow" class="fas fa-angle-double-right"></i>
+                <span class="h1">{{nextLevel}}</span>
+            </span>
         </p>
         <div v-if="isResult && level === 3">
-            <svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" fill="green" viewBox="0 0 16 16">
+            <svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" fill="#468355" viewBox="0 0 16 16">
                 <path d="m8 1.288 6.842 5.56L12.267 15H3.733L1.158 6.847 8 1.288zM16 6.5 8 0 0 6.5 3 16h10l3-9.5z"/>
             </svg>
 
             <svg
                 xmlns="http://www.w3.org/2000/svg" width="110"
-                height="110" fill="green"
+                height="110" fill="#468355"
                 viewBox="0 0 16 16"
                 style="top: 23px">
                 <path d="m8 0 8 6.5-3 9.5H3L0 6.5 8 0z"/>
@@ -44,7 +48,7 @@
             <!-- EXPECTED LEVEL -->
             <!--  -->
             <svg
-                v-if="expectedColor && expectedProgress"
+                v-if="expectedLevel && expectedColor && expectedProgress && !nextLevel"
                 :height="radius * 2"
                 :width="radius * 2"
             >
@@ -59,6 +63,22 @@
                     :cy="radius"
                 />
             </svg>
+            <svg
+                v-if="nextLevel && nextColor && nextProgress"
+                :height="radius * 2"
+                :width="radius * 2"
+            >
+                <circle
+                    :stroke="nextColor"
+                    :stroke-dasharray="circumference + ' ' + circumference"
+                    :style="{ strokeDashoffset: strokeDashoffsetNext }"
+                    :stroke-width="stroke"
+                    fill="transparent"
+                    :r="normalizedRadius"
+                    :cx="radius"
+                    :cy="radius"
+                />
+            </svg>
             <!-- ACTUAL LEVEL -->
             <svg
                 :height="radius * 2"
@@ -82,7 +102,7 @@
 <script>
 export default {
     name: 'MeasureLevelCircle',
-    props: ['radius', 'stroke', 'level', 'expectedLevel', 'isResult'],
+    props: ['radius', 'stroke', 'level', 'expectedLevel', 'isResult', 'nextLevel'],
     data () {
         return {
 
@@ -92,13 +112,13 @@ export default {
         color () {
             switch (this.level) {
             case 0:
-                return 'black'
+                return '#454545' // black
             case 1:
-                return 'red'
+                return '#D63F49' // red
             case 2:
-                return '#09759B'
+                return '#FFC107' // warning
             case 3:
-                return 'green'
+                return '#468355' // green
             default:
                 return 'transparent'
             }
@@ -106,13 +126,27 @@ export default {
         expectedColor () {
             switch (this.expectedLevel) {
             case 0:
-                return 'black'
+                return '#454545'
+            case 1:
+                return '#D63F49'
+            case 2:
+                return '#FFC107'
+            case 3:
+                return '#468355'
+            default:
+                return 'transparent'
+            }
+        },
+        nextColor () {
+            switch (this.nextLevel) {
+            case 0:
+                return '#454545'
             case 1:
-                return 'red'
+                return '#D63F49'
             case 2:
-                return '#09759B'
+                return '#FFC107'
             case 3:
-                return 'green'
+                return '#468355'
             default:
                 return 'transparent'
             }
@@ -146,6 +180,20 @@ export default {
                 return 0
             }
         },
+        nextProgress () {
+            switch (this.nextLevel){
+            case 0:
+                return 15
+            case 1:
+                return 33
+            case 2:
+                return 66
+            case 3:
+                return 100
+            default:
+                return 0
+            }
+        },
 
         normalizedRadius () {
             return this.radius - this.stroke * 2;
@@ -162,6 +210,9 @@ export default {
         strokeDashoffsetExpected() {
             return this.circumference - this.expectedProgress / 100 * this.circumference;
         },
+        strokeDashoffsetNext() {
+            return this.circumference - this.nextProgress / 100 * this.circumference;
+        },
     },
 }
 </script>
diff --git a/resources/js/components/Evaluations/Single/Components/Results/DangerLine.vue b/resources/js/components/Evaluations/Single/Components/Results/DangerLine.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ef6146a539dfd100f1f2058fae4c3167d8405aa3
--- /dev/null
+++ b/resources/js/components/Evaluations/Single/Components/Results/DangerLine.vue
@@ -0,0 +1,42 @@
+<template>
+    <tr>
+        <td> {{ danger.name }} </td>
+        <td>
+            <span v-if="level" :title="level.description" :class="['badge', level.value === 50 ? 'text-dark' : '']" :style="{ backgroundColor: level.color }">
+                {{ level.name }}
+            </span>
+        </td>
+        <td>
+            <div class="progress">
+                <div
+                    v-if="value"
+                    class="progress-bar bg-primary"
+                    :style="{ width : value + '%' }"
+                    role="progressbar" aria-valuenow="50"
+                    aria-valuemin="0"
+                    aria-valuemax="100"> <!-- getLevel(item.id).color -->
+                </div>
+            </div>
+        </td>
+    </tr>
+</template>
+<script>
+export default {
+    name: 'DangerLine',
+    props: ['danger', 'graphData', 'evaluation'],
+    computed: {
+        level() {
+
+            return this.evaluation.danger_levels.find(dl => dl.danger_id === this.danger.id).level
+        },
+        value () {
+            if (!this.graphData) {
+                return null;
+            }
+            const ind = this.graphData.labels.findIndex(l => l === this.danger.name)
+
+            return this.graphData.data[ind]
+        }
+    }
+}
+</script>
diff --git a/resources/js/components/Evaluations/Single/Components/Results/Dangers.vue b/resources/js/components/Evaluations/Single/Components/Results/Dangers.vue
index 7bc693f2582e281e97c857e666a4b315090fdb81..7bbd91791d6b1ce8f619e1a97de36a753ddb7335 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/Dangers.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/Dangers.vue
@@ -6,29 +6,24 @@
             </div>
         </div>
         <div class="card-body">
-            <table class="table table-bordered">
+            <table class="table table-bordered table-responsive-sm">
                 <thead>
                     <tr>
                         <th>Dangers</th>
                         <th>Niveau de danger</th>
-                        <th>Progression</th>
+                        <th>Expositions aux dangers</th>
                     </tr>
                 </thead>
                 <tbody v-if="evaluation">
-                    <tr v-for="item in dangers" :key="item.id">
-                        <td> {{ item.name }} </td>
-                        <td> <span class="badge" :style="{ backgroundColor: getLevel(item.id).color }">{{ getLevel(item.id).name }}</span> </td>
-                        <td>
-                            <div class="progress">
-                                <div
-                                    class="progress-bar" :style="{ backgroundColor: getLevel(item.id).color, width : getLevel(item.id).value + '%' }"
-                                    role="progressbar" aria-valuenow="50"
-                                    aria-valuemin="0"
-                                    aria-valuemax="100">
-                                </div>
-                            </div>
-                        </td>
-                    </tr>
+                    <DangerLine
+                        v-for="danger in dangers"
+                        :key="danger.id"
+                        :danger="danger"
+                        :evaluation="evaluation"
+                        :graph-data="graphData"
+                    >
+
+                    </DangerLine>
                 </tbody>
             </table>
 
@@ -39,13 +34,35 @@
 </template>
 
 <script>
+import DangerLine from "./DangerLine";
+
 export default {
     name: 'ResultDangers',
+    components: {
+        DangerLine,
+    },
     props : ['evaluation'],
     computed : {
         dangers () {
             return this.$store.state.dangers.all
+        },
+        graphData () {
+            if (!this.$store.state.graphs[this.evaluation.id] || !this.$store.state.graphs[this.evaluation.id].exposition) {
+                return null;
+            }
+
+            return this.$store.state.graphs[this.evaluation.id].exposition;
+        }
+    },
+    async mounted () {
+        this.loaded = false
+        if (typeof this.$store.state.graphs[this.evaluation.id] === 'undefined' || typeof this.$store.state.graphs[this.evaluation.id].exposition === 'undefined') {
+            await this.$store.dispatch('getGraphForEvaluation', {
+                name: 'exposition',
+                id: this.evaluation.id
+            })
         }
+        this.loaded = true
     },
     methods : {
         getLevel(dangerId) {
@@ -53,4 +70,4 @@ export default {
         }
     }
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/resources/js/components/Evaluations/Single/Components/Results/Historic.vue b/resources/js/components/Evaluations/Single/Components/Results/Historic.vue
index 4ad67cb044a04a5242b946cf112ae6c7dcc486c0..7d785c4801cb780401731357daf8b4b5bc76a4d4 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/Historic.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/Historic.vue
@@ -1,5 +1,5 @@
 <template>
-    <div class="card card-success mt-4">
+    <div class="card card-dark mt-4">
         <div class="card-header py-1">
             <div class="card-title">
                 Historique
diff --git a/resources/js/components/Evaluations/Single/Components/Results/MaturityCyber.vue b/resources/js/components/Evaluations/Single/Components/Results/MaturityCyber.vue
index 9b6e0246b3d3343fa08bea70aa27c11d14318232..1a200fca4f86aadb949df132bc3f6c0948e3d2d1 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/MaturityCyber.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/MaturityCyber.vue
@@ -1,12 +1,12 @@
 <template>
-    <div class="card card-info">
+    <div class="card card-success">
         <div class="card-header py-1">
             <div class="card-title">
                 Indice de maturité cyber
             </div>
         </div>
-        <div class="card-body">
-            <Radar :chart-data="chartData" :chart-options="options" />
+        <div class="card-body offset-md-3 col-md-6">
+            <Radar v-if="chartData" :chart-data="chartData" :chart-options="options" />
         </div>
     </div>
 </template>
@@ -28,6 +28,12 @@ export default {
             responsive: true,
             loaded: this.$store.state.graphs[this.evaluation.id],
             options: {
+                elements: {
+                    line: {
+                        borderWidth: 4,
+                        borderColor: '#50aeee',
+                    }
+                },
                 plugins: {
                     legend: {
                         display: false
@@ -36,13 +42,14 @@ export default {
                 responsive: true,
                 scales: {
                     r: {
-                        beginAtZero: true,
+                        beginAtZero: false,
+                        min:-1,
+                        max: 3,
                         ticks: {
                             color: '#000',
                             backdropColor: 'rgba(255,255,255, 0.5)',
                             z: 10,
-                            min:0,
-                            beginAtZero: true,
+                            callback: function (value) { if (Number.isInteger(value)) { return value; } },
                         },
                         pointLabels: {
                             display: true,
diff --git a/resources/js/components/Evaluations/Single/Components/Results/MeasureLevelDetails.vue b/resources/js/components/Evaluations/Single/Components/Results/MeasureLevelDetails.vue
index ed7950c9781bf20d62c9c46d47bd7873c0c7781a..c602e20b03135852a842cf0960285ca34e2abb33 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/MeasureLevelDetails.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/MeasureLevelDetails.vue
@@ -15,13 +15,13 @@
 
                     <div class="modal-body bg-light">
                         <div v-if="measureLevel">
-                            <h5 class="text-center text-bold">{{ measure.levels[measureLevel.actual_level].preconized_label }}</h5>
+                            <h5 class="text-center text-bold">{{ measure.levels[measureLevel.actual_level].actual_label }}</h5>
                             <MeasureLevelCircle
                                 radius="80"
                                 stroke="7"
                                 :level="measureLevel.actual_level"
                             />
-                            <p class="my-3 text-center"> Efficacité</p>
+                            <!-- <p class="my-3 text-center"> Efficacité</p> -->
 
                             <p class="p-1" v-html="measure.levels[measureLevel.actual_level].info"></p>
                         </div>
diff --git a/resources/js/components/Evaluations/Single/Components/Results/Measures.vue b/resources/js/components/Evaluations/Single/Components/Results/Measures.vue
index 10bade472469e6a38a0c30947c1fece8f591742e..bbf404d93c8a4a5797a84109096c0ec2605e23e7 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/Measures.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/Measures.vue
@@ -2,7 +2,7 @@
     <div class="card card-success mt-4">
         <div class="card-header py-1">
             <div class="card-title">
-                Mesure de sécurité mises en place
+                Mesures de sécurité mises en place
             </div>
         </div>
         <div class="card-body">
@@ -15,8 +15,7 @@
                             stroke="7"
                             :is-result="true"
                             :level="measureLevelSelected(item).actual_level" />
-                        <p class="my-3">Efficacité</p>
-                        <button type="button" class="btn btn-primary" @click="showModal = item.id">
+                        <button type="button" class="btn btn-primary mt-4" @click="showModal = item.id">
                             Afficher le détail de la mesure
                         </button>
                         <MeasureLevelDetails v-show="showModal === item.id" :measure="item" :measure-level="measureLevelSelected(item)" @showModal="showModal = !showModal"  />
diff --git a/resources/js/components/Evaluations/Single/Components/Results/PlanAction.vue b/resources/js/components/Evaluations/Single/Components/Results/PlanAction.vue
index 874cd3c1df9324a9cf86a04a35cc13a15ae4141e..b634b878751d47acef76b2ae5df857dc3e4b0ba9 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/PlanAction.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/PlanAction.vue
@@ -1,15 +1,16 @@
 <template>
-    <div class="card card-secondary mt-4">
+    <div class="card card-danger mt-4">
         <div class="card-header py-1">
             <div class="card-title">
                 Plan d'action
             </div>
         </div>
         <div class="card-body">
-            <table class="table table-bordered">
+            <table class="table table-bordered table-responsive-sm">
                 <thead>
                     <tr>
                         <th>Nom court</th>
+                        <th>Niveau cible</th>
                         <th>Titre du niveau</th>
                         <th>Date planifiée</th>
                         <th>Personne en charge</th>
@@ -36,7 +37,12 @@ export default {
     props : ['evaluation'],
     computed : {
         measureLevelsExpected () {
-            return this.evaluation.measure_levels.filter( ml => ml.expected_level!== null && ml.expected_level !== ml.actual_level)
+            console.log(this.evaluation.measure_levels.filter( ml => ml.expected_level!== null && ml.expected_level!== 0 && ml.expected_level !== ml.actual_level))
+            return this.evaluation.measure_levels.filter( ml => ml.expected_level!== null && ml.expected_level!== 0 && ml.expected_level !== ml.actual_level)
+                .sort((a,b) => (a.measure.short_name > b.measure.short_name) ? 1 : ((b.measure.short_name > a.measure.short_name) ? -1 : 0))
+                .sort((a,b) => (a.expected_level > b.expected_level) ? 1 : ((b.expected_level > a.expected_level) ? -1 : 0))
+                .sort((a,b) => (a.manager > b.manager) ? 1 : ((b.manager > a.manager) ? -1 : 0))
+                .sort((a,b) => (a.end_date > b.end_date) ? 1 : ((b.end_date > a.end_date) ? -1 : 0))
         },
     }
 }
diff --git a/resources/js/components/Evaluations/Single/Components/Results/PlanActionLine.vue b/resources/js/components/Evaluations/Single/Components/Results/PlanActionLine.vue
index 693cba3596bb32fc7b68bafb47e2bd81f469f5e9..10982c8b0dd9d9a57da8d9df6c5b3aff597add29 100644
--- a/resources/js/components/Evaluations/Single/Components/Results/PlanActionLine.vue
+++ b/resources/js/components/Evaluations/Single/Components/Results/PlanActionLine.vue
@@ -1,6 +1,7 @@
 <template>
     <tr>
         <td> {{ item.measure.short_name }} </td>
+        <td> {{ item.expected_level }} </td>
         <td> {{ item.measure[`level${item.expected_level}_actual_label`] }} </td>
         <td> {{ item.end_date }} </td>
         <td> {{ item.manager }} </td>
diff --git a/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelChooser.vue b/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelChooser.vue
index c0e2c599d2f58e8f939218a863b8f941fb6e8ad2..d83a9624197249179e54c487723aa422ed160244 100644
--- a/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelChooser.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelChooser.vue
@@ -4,7 +4,7 @@
             :id="`measure-level-chooser-${index}`"
             :class="{ 'text-danger': submitted && $v.levelSelected.$invalid }"
         >
-            <strong>{{ measure.name }}</strong>
+            <strong>Question {{ index +1 }}/{{measures.length}} : {{ measure.name }}</strong>
             <i class="text-muted small">(Obligatoire)</i>
         </p>
 
@@ -13,28 +13,28 @@
                 <MeasureLevelSelector
                     :measure="measure" :level="0"
                     :level-selected="levelSelected" :is-editable="isEditable"
-                    color="black"
+                    color="#454545"
                     @setLevel="setLevel($event)"/>
             </div>
             <div class="col-xl-3 col-md-6">
                 <MeasureLevelSelector
                     :measure="measure" :level="1"
                     :level-selected="levelSelected" :is-editable="isEditable"
-                    color="red"
+                    color="#D63F49"
                     @setLevel="setLevel($event)"/>
             </div>
             <div class="col-xl-3 col-md-6">
                 <MeasureLevelSelector
                     :measure="measure" :level="2"
                     :level-selected="levelSelected" :is-editable="isEditable"
-                    color="#09759B"
+                    color="#427D9F"
                     @setLevel="setLevel($event)"/>
             </div>
             <div class="col-xl-3 col-md-6">
                 <MeasureLevelSelector
                     :measure="measure" :level="3"
                     :level-selected="levelSelected" :is-editable="isEditable"
-                    color="green"
+                    color="#468355"
                     @setLevel="setLevel($event)"/>
             </div>
         </div>
@@ -50,7 +50,7 @@ export default {
     components: {
         MeasureLevelSelector
     },
-    props: ['evaluation', 'measure', 'submitted', 'isEditable', 'index'],
+    props: ['evaluation', 'measure', 'measures', 'submitted', 'isEditable', 'index'],
     data () {
         return {
             levelSelected : null,
diff --git a/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelSelector.vue b/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelSelector.vue
index af9e5ed9e27155e3ed37134a4e87fb40ea5884d7..e5b1afff2718a6efc3966c7899c89b933d8e3d6b 100644
--- a/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelSelector.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step2/MeasureLevelSelector.vue
@@ -28,13 +28,13 @@ export default {
         color () {
             switch (this.level) {
             case 0:
-                return 'black'
+                return '#454545' // black
             case 1:
-                return 'red'
+                return '#D63F49' // red
             case 2:
-                return '#09759B'
+                return '#FFC107' // yellow
             case 3:
-                return 'green'
+                return '#468355' // green
             default:
                 return 'transparent'
             }
diff --git a/resources/js/components/Evaluations/Single/Components/Step3/AttackGraph.vue b/resources/js/components/Evaluations/Single/Components/Step3/AttackGraph.vue
index 0bfe9049eb0a8447b5c10c891f9aa52f796e1c43..69173642ef847ed462f8390bd55c1d7e3ae7d5db 100644
--- a/resources/js/components/Evaluations/Single/Components/Step3/AttackGraph.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step3/AttackGraph.vue
@@ -27,14 +27,27 @@ export default {
                     legend: {
                         display: false
                     },
+                    tooltip: {
+                        callbacks: {
+                            label: function(l) {
+                                if (typeof l.label === 'string') {
+                                    return l.label
+                                }
+                                return l.label.join('')
+                            },
+                        }
+                    }
                 },
                 responsive: true,
                 scales: {
                     r: {
+                        min: 0,
+                        max: 100,
                         ticks: {
                             color: '#000',
                             backdropColor: 'rgba(255,255,255, 0.5)',
                             z: 10,
+                            callback: function (value) { if (Number.isInteger(value)) { return value; } },
                         },
                         pointLabels: {
                             display: true,
@@ -57,19 +70,15 @@ export default {
                 return l.match(/.{1,25}(\s|$)/g)
             });
             const data = this.$store.state.graphs[this.evaluation.id].attack.data;
-
+            const colors = labels.map((c, i) => {
+                return 'hsla('+ 360*i/labels.length +', 100%, 60%, 0.6)'
+            })
             return {
                 labels,
                 datasets: [
                     {
                         data,
-                        backgroundColor: [
-                            'rgba(255, 99, 132, 0.5)', // rouge
-                            'rgba(243, 156, 18, 0.5)', // gris
-                            'rgba(75, 192, 192, 0.5)', // vert
-                            'rgba(255, 221, 86, 0.5)', // jaune
-                            'rgba(54, 162, 235, 0.5)' // bleu
-                        ]
+                        backgroundColor: colors
                     }
                 ]
             }
diff --git a/resources/js/components/Evaluations/Single/Components/Step3/ExpositionGraph.vue b/resources/js/components/Evaluations/Single/Components/Step3/ExpositionGraph.vue
index 00d44d81098807453087a6683b7903353fa64d94..c2f613399f5f8f658173e9e5379d805561d56976 100644
--- a/resources/js/components/Evaluations/Single/Components/Step3/ExpositionGraph.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step3/ExpositionGraph.vue
@@ -25,6 +25,16 @@ export default {
                     legend: {
                         display: false
                     },
+                    tooltip: {
+                        callbacks: {
+                            label: function(l) {
+                                if (typeof l.label === 'string') {
+                                    return l.label
+                                }
+                                return l.label.join('')
+                            },
+                        }
+                    }
                 },
                 scales: {
                     x: {
@@ -33,6 +43,11 @@ export default {
                             maxRotation: 40,
                             minRotation: 40
                         }
+                    },
+                    y: {
+                        min: 0,
+                        max: 100,
+                        beginAtZero: true,
                     }
                 },
             },
diff --git a/resources/js/components/Evaluations/Single/Components/Step3/MeasuresGraph.vue b/resources/js/components/Evaluations/Single/Components/Step3/MeasuresGraph.vue
index 3287171b7474f96ca4bf2cf91937ee0fc7f2ddd2..0a05f11847c6a84ba53e0325c7660bd4003ef737 100644
--- a/resources/js/components/Evaluations/Single/Components/Step3/MeasuresGraph.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step3/MeasuresGraph.vue
@@ -27,19 +27,28 @@ export default {
                     legend: {
                         display: false
                     },
+                    tooltip: {
+                        callbacks: {
+                            label: function(l) {
+                                if (typeof l.label === 'string') {
+                                    return l.label
+                                }
+                                return l.label.join('')
+                            },
+                        }
+                    }
                 },
                 scales: {
                     r: {
-                        beginAtZero: true,
+                        beginAtZero: false,
                         animate: false,
-                        min:0,
+                        min:-1,
                         max:3,
                         ticks: {
                             color: '#000',
                             backdropColor: 'rgba(255,255,255, 0.8)',
                             z: 10,
-
-                            beginAtZero: true,
+                            callback: function (value) { if (Number.isInteger(value)) { return value; } },
                             stepSize: 1
                         },
                         grid: {
diff --git a/resources/js/components/Evaluations/Single/Components/Step3/RiskGraph.vue b/resources/js/components/Evaluations/Single/Components/Step3/RiskGraph.vue
index 34c72a560494dc5f6b292a77a318c047e3ec385a..51d677545e81ebb2c5f14580a05e188c4ce9ec52 100644
--- a/resources/js/components/Evaluations/Single/Components/Step3/RiskGraph.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step3/RiskGraph.vue
@@ -25,6 +25,16 @@ export default {
                     legend: {
                         display: false
                     },
+                    tooltip: {
+                        callbacks: {
+                            label: function(l) {
+                                if (typeof l.label === 'string') {
+                                    return l.label
+                                }
+                                return l.label.join('')
+                            },
+                        }
+                    }
                 },
                 scales: {
                     x: {
@@ -33,6 +43,11 @@ export default {
                             maxRotation: 40,
                             minRotation: 40,
                         }
+                    },
+                    y: {
+                        min: 0,
+                        max: 100,
+                        beginAtZero: true,
                     }
                 },
             },
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskGraphElement.vue b/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskGraphElement.vue
index 387045d057758b1c8a7ebd68f5b5116ea8316cb1..b019ff065c7226fa145c1927255ead753d4b5bcb 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskGraphElement.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskGraphElement.vue
@@ -1,5 +1,5 @@
 <template>
-    <div class="graph-element row" v-if="singleData.labels.length">
+    <div v-if="singleData.labels.length" class="graph-element row">
         <div class="graph-legend col-3 mr-0 pr-0 text-muted">
             <span :title="fullLabel">{{singleData.labels[0]}}</span>
         </div>
@@ -30,12 +30,21 @@ export default {
                     legend: {
                         display: false
                     },
+                    tooltip : {
+                        callbacks : {
+                            title : () => {
+                                return ''
+                            }
+                        }
+                    }
                 },
                 layout: {
                     padding: 0,
                 },
                 scales: {
                     x: {
+                        max:100,
+                        min: 0,
                         grid: {
                             display: false,
                             drawBorder: false,
@@ -45,6 +54,7 @@ export default {
                         }
                     },
                     y: {
+
                         grid: {
                             display: false,
                             drawBorder: false,
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskyGraph.vue b/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskyGraph.vue
index a5bd82dd8687d4139a125267cf0f21d2f270ae4e..828d5fb728f665cae0b7e8e80639d7db1303ac5c 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskyGraph.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/CyberRiskyGraph.vue
@@ -3,7 +3,7 @@
         <div class="card card-info">
             <div class="card-header py-1">
                 <div class="card-title">
-                    Niveau d'exposition au risque cyber actuel et futur
+                    Niveau d'exposition aux risques cyber actuel et futur
                 </div>
             </div>
             <div class="card-body graph">
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/MeasureActionForm.vue b/resources/js/components/Evaluations/Single/Components/Step4/MeasureActionForm.vue
index 0ff9bf119e41ee4b7dc91435f8e1fc3a89847950..97a06e315b93708d9a69435d3b4371156bb79f22 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/MeasureActionForm.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/MeasureActionForm.vue
@@ -1,17 +1,18 @@
 <template>
     <div>
         <label class="mt-2" :for="`expected_level${measure.id}`"> Choisir le niveau visé</label>
-        <select :id="`expected_level${measure.id}`" v-model="expected_level" class="form-select form-control-sm" :disabled="!isEditable"> <!-- v-model="measure.expected_level" -->
-            <option value=""> </option>
+        <select :id="`expected_level${measure.id}`" v-model="expected_level" class="form-select form-control-sm" :disabled="!isEditable || level == 3"> <!-- v-model="measure.expected_level" -->
+            <option :value="0"> </option>
             <option v-for="level in expectedLevelAvailable" :key="level" :value="level">{{ level }}</option>
         </select>
 
-        <div v-if="measureLevel.expected_level > level">
-            <label :for="`end_date${measure.id}`" class="mt-2" :class="{ 'text-danger': submitted && $v.end_date.$error }"> Choisir la date de fin</label> <i class="text-muted small">(Obligatoire)</i>
+        <div v-if="expected_level > level">
+            <label :for="`end_date${measure.id}`" class="mt-2" :class="{ 'text-danger': submitted && $v.end_date.$error }"> Choisir la date de fin <i class="text-muted small">(Obligatoire)</i></label>
             <date-range-picker
                 :id="`end_date${measure.id}`"
                 ref="picker"
                 v-model="end_date"
+                :date-format="dateFormat"
                 :disabled="!isEditable"
                 :class="{ disabled : !isEditable }"
                 :style="isEditable ? '' : 'background-color: #e9ecef'"
@@ -27,8 +28,15 @@
                 :ranges="false"
             />
 
-            <label :for="`manager${measure.id}`" class="mt-2" :class="{ 'text-danger': submitted && $v.manager.$error }"> Choisir la personne en charge</label> <i class="text-muted small">(Obligatoire)</i>
-            <input :id="`manager${measure.id}`" v-model="manager" type="text" class="form-control form-control-sm" :disabled="!isEditable"/>
+            <label :for="`manager${measure.id}`" class="mt-2" :class="{ 'text-danger': submitted && $v.manager.$error }"> Choisir la personne en charge <i class="text-muted small">(Obligatoire)</i></label>
+            <input
+                :id="`manager${measure.id}`"
+                :value="manager"
+                type="text"
+                class="form-control form-control-sm"
+                :disabled="!isEditable"
+                @change="event => manager = event.target.value"
+            />
 
         </div>
     </div>
@@ -45,7 +53,7 @@ export default {
     components: {
         DateRangePicker,
     },
-    props: ['evaluation', 'measure', 'measureInformations', 'measureLevel', 'level', 'submitted'],
+    props: ['evaluation', 'measure', 'measureInformations', 'measureLevel', 'level', 'submitted', 'index', 'nextLevel'],
     data () {
         return {
             localeData: {
@@ -60,6 +68,7 @@ export default {
                 monthNames: ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Aou', 'Sep', 'Oct', 'Nov', 'Dec'],
                 firstDay: 1
             },
+            newLevel: this.measureLevel.expected_level,
         }
     },
     computed : {
@@ -71,13 +80,21 @@ export default {
         },
         expected_level: {
             get() {
-                return this.measureLevel.expected_level
+                return this.measureLevel.expected_level || this.nextLevel
             },
             set(newValue) {
+
+                console.log('setting new value', newValue)
                 const evaluation = { ...this.evaluation }
 
-                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, expected_level : parseInt(newValue) }) : m)
-                this.$store.commit('updateEvaluation', evaluation)
+                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, expected_level : parseInt(newValue, 10) }) : m)
+
+                console.log(' evaluation.measure_levels', evaluation.measure_levels)
+                this.$store.dispatch('saveDraftEvaluation', {...evaluation, toast: false}).then(() => {
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'risks', id:evaluation.id})
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'futurerisks', id:evaluation.id})
+                    this.$store.commit('updateEvaluation', evaluation)
+                })
             }
         },
         end_date: {
@@ -89,9 +106,16 @@ export default {
             },
             set(newValue) {
                 const evaluation = { ...this.evaluation }
-
-                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, end_date : moment(newValue.startDate).format('YYYY-MM-DD') }) : m)
+                if (!this.expected_level && this.nextLevel) {
+                    this.expected_level = this.nextLevel;
+                }
+                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, end_date : moment(newValue.startDate).format('YYYY-MM-DD'), expected_level : parseInt(this.expected_level, 10) }) : m)
                 this.$store.commit('updateEvaluation', evaluation)
+                this.$store.dispatch('saveDraftEvaluation', {...evaluation, toast: false}).then(() => {
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'risks', id:evaluation.id})
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'futurerisks', id:evaluation.id})
+                    this.$store.commit('updateEvaluation', evaluation)
+                })
             }
         },
         manager: {
@@ -100,9 +124,16 @@ export default {
             },
             set(newValue) {
                 const evaluation = { ...this.evaluation }
-
-                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, manager : newValue }) : m)
+                if (!this.expected_level && this.nextLevel) {
+                    this.expected_level = this.nextLevel;
+                }
+                evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, manager : newValue, expected_level : parseInt(this.expected_level, 10) }) : m)
                 this.$store.commit('updateEvaluation', evaluation)
+                this.$store.dispatch('saveDraftEvaluation', {...evaluation, toast: false}).then(() => {
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'risks', id:evaluation.id})
+                    this.$store.dispatch('getGraphForEvaluation', {name: 'futurerisks', id:evaluation.id})
+                    this.$store.commit('updateEvaluation', evaluation)
+                })
             }
         },
     },
@@ -128,6 +159,13 @@ export default {
             } else {
                 return true
             }
+        },
+        dateFormat (classes, date) {
+            if (!classes.disabled) {
+                const d = new Date()
+                classes.disabled = date.getTime() < d.setDate(d.getDate()-1)
+            }
+            return classes
         }
     },
 }
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelDetails.vue b/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelDetails.vue
index c5158babe9cbe433b30c6027ac8e3d2b7b6f9078..dfe52f7f39496f7893599e9d4510e5a373bb1eea 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelDetails.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelDetails.vue
@@ -5,7 +5,7 @@
                 <div class="modal-content">
                     <div class="modal-header">
                         <h5 id="modal_edit_incident" class="modal-title">
-                            <b>{{measure.name}}</b>
+                            <b>{{measure.short_name}}</b>
                         </h5>
 
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close" @click="$emit('showModal')"> <!-- @click="$store.commit('hideModal')" -->
@@ -17,13 +17,13 @@
                         <div class="row">
                             <div v-for="level in measure.levels.filter(l => l.level !== 0)" :key="level.level" class="col-lg-4 py-2" >
                                 <div class="bg-white p-2 border border-primary">
-                                    <h5 class="text-center text-bold">{{ level.actual_label }}</h5>
+                                    <h5 class="text-center text-bold">{{ level.preconized_label }}</h5>
                                     <MeasureLevelCircle
                                         radius="80"
                                         stroke="7"
                                         :level="level.level"
                                     />
-                                    <p class="my-3 text-center"> Efficacité</p>
+                                    <!-- <p class="my-3 text-center"> Efficacité</p> -->
                                     <div class="bg-light row m-1 py-2">
                                         <div class="col-xl-3 col-lg-6 col-md-3 text-center">
                                             <i class="fas fa-tachometer-alt text-primary"></i><br/>
@@ -47,7 +47,7 @@
                                         </div>
                                     </div>
 
-                                    <p class="p-1" v-html="level.info"></p>
+                                    <p class="p-1" v-html="level.description"></p>
 
                                     <a v-if="level.file" class="btn btn-primary btn-block text-white" :href="level.file" target="_blank">
                                         Télécharger la fiche détaillée
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelSelector.vue b/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelSelector.vue
index ae7e955eab60aa0454d46d5ae22ad92448054105..fb6dbc7ad36441a7a14083e379b0df55e9518e0d 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelSelector.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/MeasureLevelSelector.vue
@@ -2,7 +2,10 @@
     <div v-if="measureInformations">
         <div class="card" :style="cssProps" role="radio">
             <div class="card-header h5 font-weight-bold text-center">
-                {{ measure.short_name }}
+                {{ measure.short_name }}<br>
+                <small v-if="index < 4">
+                    (Préconisé)
+                </small>
             </div>
             <div class="card-body">
                 <!-- Affiche un bouton radio et le détail du niveau -->
@@ -12,9 +15,10 @@
                     stroke="7"
                     :level="level"
                     :expected-level="measureLevel.expected_level"
+                    :next-level="nextLevel"
                 />
                 <!-- EN ATTENTE RETOUR CLIENT -->
-<!--                <p class="text-center my-4">Efficacité <i class="fas fa-angle-double-right px-2"></i> Efficacité</p>-->
+                <!--                <p class="text-center my-4">Efficacité <i class="fas fa-angle-double-right px-2"></i> Efficacité</p>-->
 
                 <MeasureActionForm
                     ref="MeasureActionForm"
@@ -24,6 +28,8 @@
                     :measure-level="measureLevel"
                     :level="level"
                     :evaluation="evaluation"
+                    :index="index"
+                    :next-level="nextLevel"
                 />
                 <button type="button" class="btn btn-primary btn-block btn-sm mt-3" data-toggle="modal" data-target="#exampleModal" @click="showModal = !showModal">
                     Afficher le détail de la mesure
@@ -45,7 +51,7 @@ export default {
         MeasureActionForm,
         MeasureLevelDetails,
     },
-    props: ['evaluation', 'measure', 'level', 'submitted'],
+    props: ['evaluation', 'measure', 'level', 'submitted', 'index', 'nextLevel'],
     data () {
         return {
             showModal : false,
@@ -61,34 +67,52 @@ export default {
         expectedColor () {
             switch (this.measureLevel.expected_level) {
             case 0:
-                return 'black'
+                return '#454545' // black
             case 1:
-                return 'red'
+                return '#D63F49' // red
             case 2:
-                return '#09759B'
+                return '#FFC107' // yellow
             case 3:
-                return 'green'
+                return '#468355' // green
+            default:
+                return 'transparent'
+            }
+        },
+        nextColor () {
+            switch (this.nextLevel) {
+            case 0:
+                return '#454545' // black
+            case 1:
+                return '#D63F49' // red
+            case 2:
+                return '#FFC107' // yellow
+            case 3:
+                return '#468355' // green
             default:
                 return 'transparent'
             }
         },
         cssProps () {
-            return this.measureLevel.expected_level > this.level ? {
-                '--border-hover-color':  this.expectedColor,
-                '--border-selected-color': this.expectedColor,
-                '--text-selected-color': 'white',
-                '--background-selected-color': this.expectedColor,
-            } : {}
+            if (this.measureLevel.expected_level && this.measureLevel.expected_level > this.level) {
+                return {
+                    '--border-hover-color': this.expectedColor,
+                    '--border-selected-color': this.expectedColor,
+                    '--text-selected-color': 'white',
+                    '--background-selected-color': this.expectedColor,
+                }
+            }
+            if (this.nextLevel && this.nextLevel > this.level) {
+                return {
+                    '--border-hover-color': this.nextColor,
+                    '--border-selected-color': this.nextColor,
+                    '--text-selected-color': 'white',
+                    '--background-selected-color': this.nextColor,
+                }
+            }
+            return {}
         },
     },
     methods : {
-        expectedLevelUpdate (value) {
-            console.log('expectedLevelUpdated', value)
-            const evaluation = { ...this.evaluation }
-
-            evaluation.measure_levels = this.evaluation.measure_levels.map(m => m.measure_id === this.measure.id ? ({...m, expected_level : parseInt(value) }) : m)
-            this.$store.commit('updateEvaluation', evaluation)
-        },
         checkValidation () {
             return this.$refs.MeasureActionForm.checkValidation()
         },
diff --git a/resources/js/components/Evaluations/Single/Components/Step4/PlanAction.vue b/resources/js/components/Evaluations/Single/Components/Step4/PlanAction.vue
index 0b317c3d428bcd0ae703d5822c70ef0642f5b916..92b42c0697d7ee0795d9bb9306e7073736aa7244 100644
--- a/resources/js/components/Evaluations/Single/Components/Step4/PlanAction.vue
+++ b/resources/js/components/Evaluations/Single/Components/Step4/PlanAction.vue
@@ -7,20 +7,46 @@
                 </div>
             </div>
             <div class="card-body">
-                <p>Dans la liste des mesures, veuillez choisir celles à mettre en place, puis planifiez-les sur un an :</p>
-                <div class="row">
-                    <div v-for="measure in measures" :key="measure.id" class="col-xl-3 col-lg-4 col-md-6 col-12">
+                <p v-if="measures && measures.length">Dans la liste des mesures, veuillez choisir celles à mettre en place, puis planifiez-les sur un an :</p>
+                <p v-if="!isOneLevelExpected && submitted" class="text-danger"><i class="fas fa-exclamation-circle"></i> Veuillez sélectionner au moins une action.</p>
+                <div v-if="measures && measures.length" class="row">
+                    <div v-for="(measure, index) in measures" :id="`measure-level-for-measure-${measure.id}`" :key="measure.id" class="col-xl-3 col-lg-4 col-md-6 col-12">
                         <MeasureLevelSelector
                             v-if="measureLevelSelected(measure)"
                             :ref="`Measure${measure.id}`"
                             :evaluation="evaluation"
                             :measure="measure"
+                            :index="index"
                             :submitted="submitted"
+                            :next-level="measureLevelSelected(measure).expected_level === 0 ||index >= 4 ? false : measureLevelSelected(measure).expected_level"
                             :level="measureLevelSelected(measure).actual_level"
                         />
                     </div>
                 </div>
-
+                <div v-else-if="!loading" class="row my-5">
+                    <div class="col-2"></div>
+                    <div class="col-8 mt-5">
+                        <p class="text-center text-lg">
+                            Vous êtes au niveau 3 sur toutes les mesures, félicitations.
+                        </p>
+                        <p class="text-center" style="font-size: 4em">
+                            🥳
+                        </p>
+                    </div>
+                    <div class="col-2"></div>
+                </div>
+                <div v-else-if="loading" class="row my-5">
+                    <div class="col-2"></div>
+                    <div class="col-8 mt-5">
+                        <p class="text-center text-lg">
+                            Chargement en cours...
+                        </p>
+                        <p class="text-center" style="font-size: 4em">
+                            <i class="fas fa-spin fa-spinner"></i>
+                        </p>
+                    </div>
+                    <div class="col-2"></div>
+                </div>
             </div>
         </div>
     </div>
@@ -36,8 +62,39 @@ export default {
     props: ['evaluation', 'submitted'],
     computed : {
         measures () {
-            return this.$store.state.measures.all.filter(m => this.measureLevelSelected(m).actual_level < 3)
+            if (!this.bestMeasures || !this.$store.state.measures.all) {
+                this.$store.dispatch('getBestMeasures', {id: this.evaluation.id})
+                return []
+            }
+            return this.$store.state.measures.all
+                .filter(m => this.measureLevelSelected(m).actual_level < 3)
+                .sort((a, b) => {
+                    return this.bestMeasures.indexOf(a.id) > this.bestMeasures.indexOf(b.id) ? 1 : -1;
+                })
         },
+        isOneLevelExpected () {
+            // Il faut au moins un expected_level dans le plan d'action
+            const isOneMeasureAvailable = this.evaluation.measure_levels.find(ml => ml.actual_level !== 3)
+            return isOneMeasureAvailable ? this.evaluation.measure_levels.find(ml => ml.expected_level > ml.actual_level) : true
+        },
+        loading () {
+            return !this.$store.state.graphs[this.evaluation.id]
+                || !this.$store.state.graphs[this.evaluation.id].bestMeasures;
+        },
+        bestMeasures () {
+            if (
+                !this.$store.state.graphs[this.evaluation.id]
+                || !this.$store.state.graphs[this.evaluation.id].bestMeasures
+            ) {
+                return null;
+            }
+
+            return this.$store.state.graphs[this.evaluation.id].bestMeasures
+        }
+    },
+    mounted() {
+        console.log('plan action mounted')
+        this.$store.dispatch('getBestMeasures', {id: this.evaluation.id})
     },
     methods : {
         measureLevelSelected (measure) {
@@ -49,11 +106,10 @@ export default {
                 validation.push(this.$refs[block][0].checkValidation())
             })
 
-            if (validation.includes(false)) {
-                console.log('validation is false')
+            if (validation.includes(false) || !this.isOneLevelExpected) {
                 return false
             }
         },
-    },
+    }
 }
 </script>
diff --git a/resources/js/components/Evaluations/Single/Components/Step5/FutureRiskGraph.vue b/resources/js/components/Evaluations/Single/Components/Step5/FutureRiskGraph.vue
new file mode 100644
index 0000000000000000000000000000000000000000..62b2b29999a2c9e15c99adfe9966128e62cc506c
--- /dev/null
+++ b/resources/js/components/Evaluations/Single/Components/Step5/FutureRiskGraph.vue
@@ -0,0 +1,116 @@
+<template>
+    <Bar v-if="loaded && chartData" :chart-data="chartData" :chart-options="options" />
+    <div v-else class=" text-center">
+        <i class="fas fa-spin fa-spinner"></i>
+    </div>
+</template>
+
+<script>
+import { Bar } from 'vue-chartjs/legacy'
+import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale} from 'chart.js'
+
+ChartJS.register(Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale)
+
+export default {
+    name: 'FutureRiskGraph',
+    components: {
+        Bar,
+    },
+    props: ['evaluation'],
+    data() {
+        return {
+            loaded: this.$store.state.graphs[this.evaluation.id] && this.$store.state.graphs[this.evaluation.id].risks && this.$store.state.graphs[this.evaluation.id].futurerisks,
+            options: {
+                plugins: {
+                    legend: {
+                        display: true
+                    },
+                    tooltip: {
+                        callbacks: {
+                            label: (l) => {
+                                const label = this.chartData.datasets[l.datasetIndex].label
+                                if (typeof label === 'string') {
+                                    return label
+                                }
+                                return label.join('')
+                            },
+                            title: (l) => {
+                                const label = this.labels[l[0].dataIndex]
+                                if (typeof label === 'string') {
+                                    return label
+                                }
+                                return label.join('')
+                            },
+                        }
+                    }
+                },
+                scales: {
+                    x: {
+                        ticks: {
+                            autoSkip: false,
+                            maxRotation: 40,
+                            minRotation: 40,
+                        }
+                    },
+                    y: {
+                        min: 0,
+                        max: 100,
+                        beginAtZero: true,
+                    }
+                },
+            },
+        }
+    },
+    computed: {
+        labels() {
+            return this.$store.state.graphs[this.evaluation.id].risks.labels.map(l => {
+                return l.match(/.{1,40}(\s|$)/g)
+            })
+        },
+        chartData() {
+            if (!this.$store.state.graphs[this.evaluation.id] || !this.$store.state.graphs[this.evaluation.id].risks) {
+                return null;
+            }
+            const data = this.$store.state.graphs[this.evaluation.id].risks.data;
+            const data2 = this.$store.state.graphs[this.evaluation.id].futurerisks.data;
+
+            return {
+                labels: this.labels,
+                datasets: [
+                    {
+                        data,
+                        backgroundColor: '#FF327B',
+                        borderColor: '#FF327B',
+                        label: "Avant",
+                        // barThickness : 1,
+                    },
+                    {
+                        data: data2,
+                        backgroundColor: '#00c6c3',
+                        borderColor: '#00c6c3',
+                        borderWidth: 2,
+                        label: "Après",
+                        // barThickness : 1,
+                    },
+                ]
+            }
+        }
+    },
+    async mounted () {
+        this.loaded = false
+        if (typeof this.$store.state.graphs[this.evaluation.id] === 'undefined' || typeof this.$store.state.graphs[this.evaluation.id].risks === 'undefined') {
+            await this.$store.dispatch('getGraphForEvaluation', {
+                name: 'risks',
+                id: this.evaluation.id
+            })
+        }
+        if (typeof this.$store.state.graphs[this.evaluation.id] === 'undefined' || typeof this.$store.state.graphs[this.evaluation.id].futurerisks === 'undefined') {
+            await this.$store.dispatch('getGraphForEvaluation', {
+                name: 'futurerisks',
+                id: this.evaluation.id
+            })
+        }
+        this.loaded = true
+    }
+}
+</script>
diff --git a/resources/js/components/Evaluations/Single/Components/Steps.vue b/resources/js/components/Evaluations/Single/Components/Steps.vue
index eec2ee3e2232f140a5a769a0d47585e95dba38ff..e568b2a66bfd5c9248f670ba45167d3ce1595ae6 100644
--- a/resources/js/components/Evaluations/Single/Components/Steps.vue
+++ b/resources/js/components/Evaluations/Single/Components/Steps.vue
@@ -4,7 +4,7 @@
             <div :class="stepView == step.num && 'font-weight-bold'" @click="setStepView(step.num)">
                 <div v-if="evaluation.current_step > step.num" class="step-done step button">
                     <div class="checkmark">
-                        <i class="fas fa-check bg-success"></i>
+                        <i class="fas fa-check bg-success" :style="stepView == step.num ? 'background-color: rgb(85, 200, 85) !important' : ''"></i>
                     </div>
                     <span v-if="step.num <= 4" class="line bg-success"></span>
                     <div class="text-sm">
diff --git a/resources/js/components/Evaluations/Single/Steps/Step2.vue b/resources/js/components/Evaluations/Single/Steps/Step2.vue
index ae0463ec5d64b2174ad8f9a354b07dd8571265cf..7e3c9112cd1d36abe5b713e29cd726f8d1e76661 100644
--- a/resources/js/components/Evaluations/Single/Steps/Step2.vue
+++ b/resources/js/components/Evaluations/Single/Steps/Step2.vue
@@ -15,6 +15,7 @@
                         :ref="`Measure${measure.id}`"
                         :index="index"
                         :measure="measure"
+                        :measures="measures"
                         :evaluation="evaluation"
                         :is-editable="isEditable"
                         :submitted="submitted"
diff --git a/resources/js/components/Evaluations/Single/Steps/Step3.vue b/resources/js/components/Evaluations/Single/Steps/Step3.vue
index 1ba73a1603fb6d13becca538e5b0f928013e716d..a97577b9026204306d008fe55b64dae1beba9af8 100644
--- a/resources/js/components/Evaluations/Single/Steps/Step3.vue
+++ b/resources/js/components/Evaluations/Single/Steps/Step3.vue
@@ -1,55 +1,59 @@
 <template>
-    <div v-if="evaluation" class="row">
-        <div class="col-md-6">
-            <div class="card card-info">
-                <div class="card-header py-1">
-                    <div class="card-title">
-                        Surface de mise en oeuvre des mesures de sécurité
+    <div v-if="evaluation">
+        <div class="row" style="max-width: 1200px;margin: 0 auto">
+            <div class="col-md-6">
+                <div class="card card-info">
+                    <div class="card-header py-1">
+                        <div class="card-title">
+                            Surface de mise en oeuvre des mesures de sécurité
+                        </div>
+                    </div>
+                    <div class="card-body">
+                        <MeasuresGraph :evaluation="evaluation" />
                     </div>
                 </div>
-                <div class="card-body">
-                    <MeasuresGraph :evaluation="evaluation" />
-                </div>
-            </div>
 
-        </div>
-        <div class="col-md-6">
-            <div class="card card-success">
-                <div class="card-header py-1">
-                    <div class="card-title">
-                        Niveau de risque
+            </div>
+            <div class="col-md-6">
+                <div class="card card-success">
+                    <div class="card-header py-1">
+                        <div class="card-title">
+                            Niveau de risque
+                        </div>
+                    </div>
+                    <div class="card-body">
+                        <RiskGraph :evaluation="evaluation" />
                     </div>
-                </div>
-                <div class="card-body">
-                    <RiskGraph :evaluation="evaluation" />
                 </div>
             </div>
-        </div>
-        <div class="col-md-6">
-            <div class="card card-success">
-                <div class="card-header py-1">
-                    <div class="card-title">
-                        Niveau d'exposition au risque cyber
+            <div class="col-md-6">
+                <div class="card card-success">
+                    <div class="card-header py-1">
+                        <div class="card-title">
+                            Niveau d'exposition au risque cyber
+                        </div>
+                    </div>
+                    <div class="card-body px-5">
+                        <ExpositionGraph :evaluation="evaluation"/>
                     </div>
-                </div>
-                <div class="card-body px-5">
-                    <ExpositionGraph :evaluation="evaluation"/>
                 </div>
             </div>
-        </div>
-        <div class="col-md-6">
-            <div class="card">
-                <div class="card-header py-1 bg-purple">
-                    <div class="card-title">
-                        Vraisemblance de réussite des scénarios d'attaque
+            <div class="col-md-6">
+                <div class="card">
+                    <div class="card-header py-1 bg-purple">
+                        <div class="card-title">
+                            Vraisemblance de réussite des scénarios d'attaque
+                        </div>
+                    </div>
+                    <div class="card-body">
+                        <AttackGraph :evaluation="evaluation" :max-height="'none'"/>
                     </div>
-                </div>
-                <div class="card-body">
-                    <AttackGraph :evaluation="evaluation" :max-height="'none'"/>
                 </div>
             </div>
         </div>
-        <Buttons :is-editable="isEditable" />
+        <div class="row">
+            <Buttons :is-editable="isEditable" />
+        </div>
     </div>
 </template>
 
diff --git a/resources/js/components/Evaluations/Single/View/index.vue b/resources/js/components/Evaluations/Single/View/index.vue
index 59384172716c81ed9c565633453add9d32908739..b20db4592a140f210282833b332431bfc6468aa4 100644
--- a/resources/js/components/Evaluations/Single/View/index.vue
+++ b/resources/js/components/Evaluations/Single/View/index.vue
@@ -3,21 +3,29 @@
         <button class="btn btn-outline-primary" @click.prevent="$router.push('/evaluations')">
             <i class="fas fa-arrow-left"></i> Retour à la liste des évaluations
         </button>
-        <button class="btn btn-outline-primary" @click.prevent="alert('Pas encore implémenté')">
+        <a
+            class="btn btn-outline-primary"
+            :href="`/pdf/dossierCyberSecurite/${evaluation.organization_id}/${evaluation.id}`"
+            target="_blank"
+        >
             <i class="fas fa-print"></i> Imprimer l'évaluation
-        </button>
-        <button class="btn btn-outline-primary" @click.prevent="editRow()">
+        </a>
+        <button
+            v-if="user && user.data && user.data.role <= $store.state.user.roles.ROLE_MANAGER"
+            class="btn btn-outline-primary"
+            @click.prevent="editRow()"
+        >
             <i v-if="editing" class="fas fa-spin fa-spinner"></i>
             <i v-else class="fas fa-pencil-alt"></i>
             Modifier l'évaluation
         </button>
 
-        <div class="row">
+        <div class="row" style="max-width: 1200px;margin: 0 auto">
             <div class="col-md-12">
                 <Dangers :evaluation="evaluation" />
                 <Measures :evaluation="evaluation" />
                 <div class="card">
-                    <div class="card-header py-1 bg-purple">
+                    <div class="card-header py-1 bg-warning">
                         <div class="card-title">
                             Vraisemblance de réussite des scénarios d'attaque
                         </div>
@@ -28,20 +36,20 @@
                 </div>
                 <PlanAction :evaluation="evaluation" />
             </div>
-            <div class="col-md-6">
-                <div class="card card-success">
-                    <div class="card-header py-1">
+            <div class="col-md-12">
+                <div class="card">
+                    <div class="card-header py-1 bg-info text-white">
                         <div class="card-title">
-                            Niveau d'exposition au risque cyber
+                            Niveau d'exposition aux risques cyber actuel et futur
                         </div>
                     </div>
                     <div class="card-body">
-                        <ExpositionGraph :evaluation="evaluation" />
+                        <FutureRiskGraph :evaluation="evaluation" />
                     </div>
                 </div>
             </div>
-            <div class="col-md-6">
-                <MaturityCyber :evaluation="evaluation" />
+            <div class="col-md-12">
+                <MaturityCyber :evaluation="evaluation"/>
             </div>
             <div class="col-md-6">
                 <Historic :evaluation="evaluation" />
@@ -59,13 +67,13 @@ import PlanAction from '../Components/Results/PlanAction'
 import MaturityCyber from '../Components/Results/MaturityCyber'
 import Historic from '../Components/Results/Historic'
 import NotFound from "../../../Errors/NotFound";
-import ExpositionGraph from "../Components/Step3/ExpositionGraph";
+import FutureRiskGraph from "../Components/Step5/FutureRiskGraph";
 
 
 export default {
     name: 'SingleEvaluationView',
     components: {
-        ExpositionGraph,
+        FutureRiskGraph,
         NotFound,
         Dangers,
         Measures,
@@ -82,7 +90,10 @@ export default {
     computed: {
         evaluation () {
             return this.$store.state.evaluations.all.find(e => e.id === parseInt(this.$route.params.id, 10))
-        }
+        },
+        user () {
+            return this.$store.state.user
+        },
     },
     methods : {
         async editRow () {
@@ -103,7 +114,4 @@ export default {
 .btn-outline-primary {
     background-color: white;
 }
-.btn-outline-primary:hover {
-    background-color: #395B64!important;
-}
 </style>
diff --git a/resources/js/components/Measures/Single/LevelBlock.vue b/resources/js/components/Measures/Single/LevelBlock.vue
index f7e5bd7aafc93545236b305eef55a02dfff21834..63f73baea3fb04b5a9015d71bb24fbf029aa28b8 100644
--- a/resources/js/components/Measures/Single/LevelBlock.vue
+++ b/resources/js/components/Measures/Single/LevelBlock.vue
@@ -18,6 +18,17 @@
                 <span>{{ levelEdit.preconized_label }}</span>
             </div>
 
+
+
+            <div class="form-group">
+                <label
+                    class="m-0"
+                >Description</label>
+                <div
+                    v-html="levelEdit.description"
+                />
+            </div>
+
             <!-- FILE -->
             <div class="form-group">
                 <div v-if="hasDefaultFile">
@@ -31,6 +42,7 @@
                     </a>
                 </div>
             </div>
+
             <div class="form-group">
                 <div v-if="hasDefaultFile">
                     <label
@@ -60,27 +72,8 @@
                 >
             </div>
             <!-- END FILE -->
-
-            <div class="form-group">
-                <label
-                    class="m-0"
-                    :class="{ 'text-danger': submitted && $v.levelEdit.description.$error }"
-                >Description</label> <i class="text-muted small">(Obligatoire)</i>
-                <ckeditor
-                    v-model="levelEdit.description"
-                    :editor="editor"
-                    :config="editorConfig"
-                    :class="{ 'is-invalid': submitted && $v.levelEdit.description.$error }"
-                />
-                <div
-                    v-if="$v.levelEdit.description.$error"
-                    class="text-danger"
-                >
-                    Champ obligatoire
-                </div>
-            </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.levelEdit.difficulty.$error }" :for="`difficulty${level.level}`">Niveau de difficulté de l'action</label> <i class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.levelEdit.difficulty.$error }" :for="`difficulty${level.level}`">Niveau de difficulté de l'action <i class="text-muted small">(Obligatoire)</i></label> 
                 <select
                     :id="`difficulty${level.level}`"
                     v-model="levelEdit.difficulty"
@@ -118,7 +111,7 @@
                 </div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.levelEdit.duration.$error }" :for="`duration${level.level}`">Temps estimé pour la mise en oeuvre de l'action</label> <i class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.levelEdit.duration.$error }" :for="`duration${level.level}`">Temps estimé pour la mise en oeuvre de l'action <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     :id="`duration${level.level}`"
                     v-model="levelEdit.duration" type="text"
@@ -133,7 +126,7 @@
                 </div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.levelEdit.assistance.$error }" :for="`assistance${level.level}`">Besoin d'accompagnement</label> <i class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.levelEdit.assistance.$error }" :for="`assistance${level.level}`">Besoin d'accompagnement <i class="text-muted small">(Obligatoire)</i></label> 
                 <select
                     :id="`assistance${level.level}`"
                     v-model="levelEdit.assistance" class="form-control form-control-sm"
diff --git a/resources/js/components/Measures/Single/index.vue b/resources/js/components/Measures/Single/index.vue
index 93a8974052530a5924e4f670b432d2eb62d298c6..fe2efdf0a91b1091479f0df95e4621c34ff3523e 100644
--- a/resources/js/components/Measures/Single/index.vue
+++ b/resources/js/components/Measures/Single/index.vue
@@ -40,7 +40,7 @@
                     title="Niveau 2"
                     :level="measure.levels[2]"
                     :submitted="submitted"
-                    bg="bg-info"
+                    bg="bg-warning"
                 />
                 <LevelBlock
                     ref="Level3"
diff --git a/resources/js/components/Menu/PageHeader.vue b/resources/js/components/Menu/PageHeader.vue
index d1f52bcb5fb5578a8ed0eeaf83aa08aff6b66b51..2e60ef91b62204c5471ebb45bc0c6a3632c35db9 100644
--- a/resources/js/components/Menu/PageHeader.vue
+++ b/resources/js/components/Menu/PageHeader.vue
@@ -29,7 +29,6 @@
     </div>
 </template>
 <script>
-import moment from 'moment'
 
 export default {
     name: 'Breadcrumbs',
@@ -39,6 +38,9 @@ export default {
         }
     },
     computed: {
+        evalStep () {
+            return this.$route.params.step
+        },
         matched() {
             console.log('matched', this.$route.matched)
             console.log('route', this.$route)
@@ -83,8 +85,19 @@ export default {
                 return measure ? measure.name : null
 
             case 'evaluation':
-                return evaluation && this.$route.meta.edit !== true ? moment(evaluation.updated_at).format('DD/MM/YYYY') : null
+                if (evaluation && this.evalStep) {
+                    const stepName = this.evalStep === '1' ? 'Dangers' : this.evalStep === '2' ? 'Mesures de sécurité' : this.evalStep === '3' ? 'Synthèse des mesures de sécurité' : this.evalStep === '4' ? "Plan d'action" : this.evalStep === '5' ? 'Mesurer la maturité cyber' : null
+                    const stepNumber = this.evalStep === '3' ? 'intermédiaire' : this.evalStep === '4' ? "3" : this.evalStep === '5' ? '4' : null
+                    return `Étape ${stepNumber || this.evalStep} : ${stepName}`
+                }
+
+                if (evaluation && evaluation.status === 2) {
+                    return (new Date(evaluation.updated_at)).toLocaleDateString('fr')
+                }
+
+                return null
 
+                // && this.$route.meta.edit !== true ? moment(evaluation.updated_at).format('DD/MM/YYYY') : null
             default:
                 return null
             }
diff --git a/resources/js/components/Menu/Side.vue b/resources/js/components/Menu/Side.vue
index fb9a62af0c8d702cb4676985e99efa4d0531fe9a..1ac6ee67a37596522543e8517e372f62952a5c8a 100644
--- a/resources/js/components/Menu/Side.vue
+++ b/resources/js/components/Menu/Side.vue
@@ -64,7 +64,8 @@
                         <a
                             :href="`/pdf/dossierCyberSecurite/${user.organization_id}`"
                             target="_blank"
-                            class="nav-link w-100 rounded-0"
+                            :class="`nav-link w-100 rounded-0 ${doneEvaluations.length ? '' : 'disabled'}`"
+                            :aria-disabled="!doneEvaluations.length"
                         >
                             <i class="nav-icon fas fa-clipboard" />
                             <p>
@@ -76,7 +77,8 @@
                         <a
                             :href="`/pdf/politiqueSecurite/${user.organization_id}`"
                             target="_blank"
-                            class="nav-link w-100 rounded-0"
+                            :class="`nav-link w-100 rounded-0 ${doneEvaluations.length ? '' : 'disabled'}`"
+                            :aria-disabled="!doneEvaluations.length"
                         >
                             <i class="nav-icon fas fa-clipboard" />
                             <p>
@@ -88,7 +90,8 @@
                         <a
                             :href="`/pdf/planAction/${user.organization_id}`"
                             target="_blank"
-                            class="nav-link w-100 rounded-0"
+                            :class="`nav-link w-100 rounded-0 ${doneEvaluations.length ? '' : 'disabled'}`"
+                            :aria-disabled="!doneEvaluations.length"
                         >
                             <i class="nav-icon fas fa-clipboard" />
                             <p>
@@ -197,6 +200,7 @@ export default {
     },
     computed: {
         user () {
+            console.log('user', this.$store.state.user.data)
             return this.$store.state.user.data
         },
         roles () {
@@ -204,6 +208,9 @@ export default {
         },
         routes () {
             return routes[0].children.filter((r) => r.path !== '/login')
+        },
+        doneEvaluations () {
+            return this.$store.state.evaluations.all.filter(e => e.status === 2)
         }
     },
     methods: {
@@ -253,4 +260,7 @@ export default {
 .menu-elevation {
     box-shadow: 0 5px 5px rgba(0,0,0,.25),0 1px 1px rgba(0,0,0,.22) !important;
 }
+a.nav-link.disabled {
+    opacity: 0.5;
+}
 </style>
diff --git a/resources/js/components/Organizations/List.vue b/resources/js/components/Organizations/List.vue
index 28ba17aad3033e8fc026e250482e30a84dd39de5..e3c8be217290c8dbe20e2849872df105bcc0f1fa 100644
--- a/resources/js/components/Organizations/List.vue
+++ b/resources/js/components/Organizations/List.vue
@@ -48,7 +48,7 @@
                     <span v-if="props.row.active" class="badge badge-success">
                         Actif
                     </span>
-                    <span v-else class="badge badge-secondary">
+                    <span v-else class="badge badge-grey bg-grey">
                         Inactif
                     </span>
                 </div>
diff --git a/resources/js/components/Organizations/Single/AddressBlock.vue b/resources/js/components/Organizations/Single/AddressBlock.vue
index f591dc735a2fff399987ea823ea97f6b01655948..8664c43cc4ff3c4ae82259ca38b47e72ef384fc6 100644
--- a/resources/js/components/Organizations/Single/AddressBlock.vue
+++ b/resources/js/components/Organizations/Single/AddressBlock.vue
@@ -5,64 +5,67 @@
                 Adresse
             </div>
         </div>
-        <div
-            v-if="address"
-            class="card-body"
-        >
-            <div v-if="address" class="card-body">
-                <div class="form-group">
-                    <label
-                        :class="{ 'text-danger': submitted && $v.address.address.$error }"
-                        for="adresse">Adresse</label> <i class="text-muted small">(Obligatoire)</i>
-                    <div class="text-muted small">Rue, voie, boîte postale...</div>
-                    <input
-                        id="adresse" v-model="address.address"
-                        type="text" class="form-control form-control-sm"
-                        :class="{ 'is-invalid': submitted && $v.address.address.$error }">
-                    <div v-if="$v.address.address.$error" class="text-danger">Champ obligatoire</div>
-                </div>
-                <div class="form-group">
-                    <label for="complement">Informations complémentaires</label>
-                    <div class="text-muted small">Bâtiment, étage, lieu-dit...</div>
-                    <input id="complement" v-model="address.moreInfos" type="text" class="form-control form-control-sm">
-                </div>
-                <div class="form-group">
-                    <label :class="{ 'text-danger': submitted && $v.address.cp.$error }" for="code_postal">Code
-                        postal</label> <i class="text-muted small">(Obligatoire)</i>
-                    <input
-                        id="code_postal" v-model="address.cp"
-                        type="text" class="form-control form-control-sm"
-                        :class="{ 'is-invalid': submitted && $v.address.cp.$error }">
-                    <div v-if="submitted && !$v.address.cp.required" class="text-danger">Champ obligatoire</div>
-                    <div v-if="submitted && !$v.address.cp.integer" class="text-danger">Doit être un nombre</div>
-                </div>
-                <div class="form-group">
-                    <label :class="{ 'text-danger': submitted && $v.address.city.$error }" for="ville">Ville</label> <i
-                        class="text-muted small">(Obligatoire)</i>
-                    <input
-                        id="ville" v-model="address.city"
-                        type="text" class="form-control form-control-sm"
-                        :class="{ 'is-invalid': submitted && $v.address.city.$error }">
-                    <div v-if="$v.address.city.$error" class="text-danger">Champ obligatoire</div>
-                </div>
-                <div class="form-group">
-                    <label :class="{ 'text-danger': submitted && $v.address.codeInsee.$error }" for="insee">Code
-                        INSEE</label> <i class="text-muted small">(Obligatoire)</i>
-                    <input
-                        id="insee" v-model="address.codeInsee"
-                        type="text"
-                        class="form-control form-control-sm" :class="{ 'is-invalid': submitted && $v.address.codeInsee.$error }">
-                    <div v-if="$v.address.codeInsee.$error" class="text-danger">Champ obligatoire</div>
-                </div>
+
+        <div v-if="address" class="card-body">
+            <div class="form-group">
+                <label
+                    :class="{ 'text-danger': submitted && $v.address.address.$error }"
+                    for="adresse">Adresse</label> <i class="text-muted small">(Obligatoire)</i>
+                <div class="text-muted small">Rue, voie, boîte postale...</div>
+                <input
+                    id="adresse" v-model="address.address"
+                    type="text" class="form-control form-control-sm"
+                    :class="{ 'is-invalid': submitted && $v.address.address.$error }">
+                <div v-if="$v.address.address.$error" class="text-danger">Champ obligatoire</div>
+            </div>
+            <div class="form-group">
+                <label for="complement">Informations complémentaires</label>
+                <div class="text-muted small">Bâtiment, étage, lieu-dit...</div>
+                <input id="complement" v-model="address.moreInfos" type="text" class="form-control form-control-sm">
+            </div>
+            <div class="form-group">
+                <label :class="{ 'text-danger': submitted && $v.address.cp.$error }" for="code_postal">Code
+                    postal <i class="text-muted small">(Obligatoire)</i></label>
+                <input
+                    id="code_postal" v-model="address.cp"
+                    type="text" class="form-control form-control-sm"
+                    :class="{ 'is-invalid': submitted && $v.address.cp.$error }">
+                <div v-if="submitted && !$v.address.cp.required" class="text-danger">Champ obligatoire</div>
+                <div v-if="submitted && !$v.address.cp.integer" class="text-danger">Doit être un nombre</div>
+            </div>
+            <div class="form-group">
+                <label :class="{ 'text-danger': submitted && $v.address.city.$error }" for="ville">Ville</label> <i
+                    class="text-muted small">(Obligatoire)</i>
+                <input
+                    id="ville" v-model="address.city"
+                    type="text" class="form-control form-control-sm"
+                    :class="{ 'is-invalid': submitted && $v.address.city.$error }">
+                <div v-if="$v.address.city.$error" class="text-danger">Champ obligatoire</div>
+            </div>
+            <div class="form-group">
+                <label :class="{ 'text-danger': submitted && $v.address.codeInsee.$error }" for="insee">Code INSEE <i class="text-muted small">(Obligatoire)</i></label>
+                <input
+                    id="insee" v-model="address.codeInsee"
+                    type="text"
+                    class="form-control form-control-sm" :class="{ 'is-invalid': submitted && $v.address.codeInsee.$error }">
+                <div v-if="$v.address.codeInsee.$error" class="text-danger">Champ obligatoire</div>
+            </div>
+            <div class="form-group">
+                <PositionBlock :address="address" @addressError="addressError($event)" @updateAddressLoc="updateAddressLoc" />
+                <div v-if="$v.address.lat.$error || $v.address.lng.$error" class="text-danger">Localisation obligatoire</div>
             </div>
         </div>
     </div>
 </template>
 <script>
 import {required, integer} from 'vuelidate/lib/validators'
+import PositionBlock from './PositionBlock.vue'
 
 export default {
     name: 'AddressBlock',
+    components : {
+        PositionBlock,
+    },
     props: ['orgAddress', 'submitted'],
     data() {
         return {
@@ -75,7 +78,9 @@ export default {
             address: {required},
             cp: {required, integer},
             city: {required},
-            codeInsee: {required}
+            codeInsee: {required},
+            lat: {required},
+            lng: {required},
         }
 
     },
@@ -83,12 +88,16 @@ export default {
     methods: {
         checkValidation() {
             this.$v.$touch()
-            if (this.$v.$invalid) {
-                return false
-            } else {
-                return true
-            }
-        }
+            return !this.$v.$invalid
+        },
+        addressError (message) {
+            this.$parent.toaster(this, message, 'bg-red')
+        },
+        updateAddressLoc (address, lat, lng) {
+            console.log('updateAddressLoc', lat, lng)
+            this.address.lat = lat
+            this.address.lng = lng
+        },
     }
 }
 </script>
diff --git a/resources/js/components/Organizations/Single/InformationsBlock.vue b/resources/js/components/Organizations/Single/InformationsBlock.vue
index bc46903da4203ed1303b13527ff14ae679bdf2e0..86dc4b9e912ac09dc81264def9e6145d9cc7b4d1 100644
--- a/resources/js/components/Organizations/Single/InformationsBlock.vue
+++ b/resources/js/components/Organizations/Single/InformationsBlock.vue
@@ -7,8 +7,7 @@
         </div>
         <div class="card-body">
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.organization.name.$error }" for="nom">Nom</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.organization.name.$error }" for="nom">Nom<i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     id="nom"
                     v-model="organization.name" :disabled="!isAdmin()"
@@ -18,7 +17,7 @@
             </div>
             <div class="form-group">
                 <label :class="{ 'text-danger': submitted && $v.organization.short_name.$error }" for="nom_court">Nom
-                    court</label> <i class="text-muted small">(Obligatoire)</i>
+                    court <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     id="nom_court"
                     v-model="organization.short_name" :disabled="!isAdmin()"
@@ -27,8 +26,8 @@
                 <div v-if="$v.organization.short_name.$error" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.organization.type.$error }" for="type">Type</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.organization.type.$error }" for="type">Type <i
+                    class="text-muted small">(Obligatoire)</i></label> 
                 <select
                     id="type" v-model="organization.type"
                     :disabled="!isAdmin()"
@@ -43,8 +42,7 @@
                 <div v-if="$v.organization.type.$error" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.organization.siren.$error }" for="siren">SIREN</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.organization.siren.$error }" for="siren">SIREN <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     id="siren" v-model="organization.siren"
                     :disabled="!isAdmin()"
@@ -53,8 +51,7 @@
                 <div v-if="$v.organization.siren.$error" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.organization.territory_id.$error }" for="territory">Territoire</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.organization.territory_id.$error }" for="territory">Territoire <i class="text-muted small">(Obligatoire)</i></label> 
                 <select
                     id="type" v-model="organization.territory_id"
                     :disabled="!isAdmin()"
diff --git a/resources/js/components/Organizations/Single/PositionBlock.vue b/resources/js/components/Organizations/Single/PositionBlock.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1903aa2dfba594809746e3c0d26d5af60b1f440b
--- /dev/null
+++ b/resources/js/components/Organizations/Single/PositionBlock.vue
@@ -0,0 +1,106 @@
+<template>
+    <div>
+        <button class="btn btn-primary btn-sm mb-2" @click.prevent="locateAddress"><i :class="loading ? 'fa fa-spinner fa-spin' : ''"></i> Localiser l'adresse</button>
+        <div id="map"></div>
+    </div>
+</template>
+<script>
+import L from 'leaflet';
+import axios from 'axios'
+
+export default {
+    name: 'PositionBlock',
+    props: ['address'],
+    data() {
+        return {
+            loading : false,
+            map : null,
+        }
+    },
+    computed: {
+        fullAddress () {
+            return `${this.address.address} ${this.address.cp} ${this.address.city}`
+        }
+    },
+    mounted () {
+        this.initMap()
+        this.address && this.address.lat && this.address.lng && this.setMarker(parseFloat(this.address.lat), parseFloat(this.address.lng))
+    },
+    methods: {
+        initMap () {
+            this.map = L.map('map') 
+
+            L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
+                maxZoom: 19,
+            }).addTo(this.map);
+
+            this.map.setView([46.9, 1.9], 5); // FRANCE BOUNDS
+            this.map.attributionControl.setPrefix('')
+        },
+        setMarker (lat, lng) {
+            this.marker = L.circleMarker([lat, lng], {draggable: true, radius: 7,fillColor:'red',fillOpacity:0.5,color: 'red'})
+
+            this.$emit('updateAddressLoc', this.address, lat, lng)
+
+            this.marker.on({
+                mousedown: () => this.map.on('mousemove', (e) => {
+                    this.marker.setLatLng(e.latlng); 
+                    this.map.dragging.disable()
+
+                    // this.address.lat = e.latlng.lat
+                    this.$emit('updateAddressLoc', this.address, e.latlng.lat, e.latlng.lng)
+                }), 
+                mouseup: () => {
+                    this.map.dragging.enable()
+                    this.map.off('mousemove')
+                }
+            }) 
+            this.marker.addTo(this.map)
+
+            const latLngs = [ this.marker.getLatLng() ];
+            const markerBounds = L.latLngBounds(latLngs);
+            this.map.fitBounds(markerBounds);
+        },
+        async locateAddress () {
+            console.log('locateAddress')
+            if (!this.address.address || !this.address.cp || !this.address.city) {
+                this.$emit('addressError', "L'adresse n'est pas complète")
+                    
+            } else {
+                this.loading = true
+                await axios.get(`https://api-adresse.data.gouv.fr/search/?autocomplete=1&postcode=${this.address.cp}&q=${this.fullAddress}`, 
+                    {
+                        transformRequest: (data, headers) => {
+                            delete headers.common['X-CSRF-TOKEN'];
+                        }
+                    }
+                )
+                    .then(res => {
+                        this.loading = false
+
+                        if (!res.data.features.length) {
+                            this.$emit('addressError', "L'adresse n'a pas été trouvée")
+                        
+                        } else {
+                            this.enableMap = true
+                            const pointData = res.data.features[0]
+
+                            this.marker && this.map.removeLayer(this.marker)
+
+                            this.setMarker(pointData.geometry.coordinates[1], pointData.geometry.coordinates[0])
+                        }
+                    })
+                    .catch( () => {
+                        this.loading = false; 
+                        this.$emit('addressError', "L'adresse n'a pas été trouvée")
+                    })
+            }
+        }
+    }
+}
+</script>
+<style scoped>
+#map {
+    height: 400px;
+}
+</style>
diff --git a/resources/js/components/Organizations/Single/ReferentBlock.vue b/resources/js/components/Organizations/Single/ReferentBlock.vue
index f1d5fc8e90a164914360ef48b9923a470d5510de..0f576829ad7bbec0859060268fc7ad1b2465d31e 100644
--- a/resources/js/components/Organizations/Single/ReferentBlock.vue
+++ b/resources/js/components/Organizations/Single/ReferentBlock.vue
@@ -29,7 +29,7 @@
             <div class="form-group">
                 <label
                     :class="{ 'text-danger': submitted && $v.referent.firstname.$error }"
-                    :for="`firstname${order}`">Prénom</label> <i class="text-muted small">(Obligatoire)</i>
+                    :for="`firstname${order}`">Prénom <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     :id="`firstname${order}`" v-model="referent.firstname"
                     type="text" class="form-control form-control-sm"
@@ -37,8 +37,7 @@
                 <div v-if="$v.referent.firstname.$error" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.referent.lastname.$error }" :for="`name${order}`">Nom</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.referent.lastname.$error }" :for="`name${order}`">Nom <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     :id="`name${order}`" v-model="referent.lastname"
                     type="text" class="form-control form-control-sm"
@@ -48,7 +47,7 @@
             <div class="form-group">
                 <label
                     :class="{ 'text-danger': submitted && $v.referent.function.$error }"
-                    :for="`fonction${order}`">Fonction</label> <i class="text-muted small">(Obligatoire)</i>
+                    :for="`fonction${order}`">Fonction <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     :id="`fonction${order}`"  v-model="referent.function"
                     type="text" class="form-control form-control-sm"
@@ -56,8 +55,7 @@
                 <div v-if="$v.referent.function.$error" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.referent.email.$error }" :for="`email${order}`">Email</label> <i
-                    class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.referent.email.$error }" :for="`email${order}`">Email <i class="text-muted small">(Obligatoire)</i></label> 
                 <input
                     :id="`email${order}`" v-model="referent.email"
                     type="text" class="form-control form-control-sm"
@@ -68,8 +66,8 @@
                 <div v-if="submitted && !$v.referent.email.required" class="text-danger">Champ obligatoire</div>
             </div>
             <div class="form-group">
-                <label :class="{ 'text-danger': submitted && $v.referent.phone.$error }" :for="`phone${order}`">Téléphone</label>
-                <i class="text-muted small">(Obligatoire)</i>
+                <label :class="{ 'text-danger': submitted && $v.referent.phone.$error }" :for="`phone${order}`">Téléphone <i class="text-muted small">(Obligatoire)</i></label>
+                
                 <input
                     :id="`phone${order}`" v-model="referent.phone"
                     type="text" class="form-control form-control-sm"
diff --git a/resources/js/components/Organizations/Single/index.vue b/resources/js/components/Organizations/Single/index.vue
index 74b21ea177f150f98e104402ed548116a5b03cd2..e3a9f377dc5a28afb3b78f73e2afcc908588b141 100644
--- a/resources/js/components/Organizations/Single/index.vue
+++ b/resources/js/components/Organizations/Single/index.vue
@@ -120,7 +120,9 @@ const defaultOrg = {
         moreInfos: null,
         cp: null,
         city: null,
-        codeInsee: null
+        codeInsee: null,
+        lat : null,
+        lng : null,
     },
     referent: {
         id: null,
diff --git a/resources/js/components/Users/EditMailModal.vue b/resources/js/components/Users/EditMailModal.vue
index ce7305c6957ee6a2a48f3cd0f7089c10c2acf5fa..4a8ca373aad1b05ab70040edf00816ec68cd1a83 100644
--- a/resources/js/components/Users/EditMailModal.vue
+++ b/resources/js/components/Users/EditMailModal.vue
@@ -53,7 +53,7 @@
                                     v-if="emailError"
                                     class="text-danger"
                                 >
-                                    <b>Cette adresse mail n'est pas valide ou n'est pas associée à un utlisateur.</b>
+                                    <b>Cette adresse mail n'est pas valide ou n'est pas associée à un utilisateur.</b>
                                 </p>
                             </div>
                         </form>
diff --git a/resources/js/components/Users/List.vue b/resources/js/components/Users/List.vue
index 36fe90b90869543fc8b5f09eead31065a0730ec4..5db76ca2886bf3bb7e74151d006262f5ffab7d47 100644
--- a/resources/js/components/Users/List.vue
+++ b/resources/js/components/Users/List.vue
@@ -81,7 +81,7 @@
                     </span>
                     <span
                         v-else
-                        class="badge badge-secondary"
+                        class="badge badge-grey bg-grey"
                     >
                         Inactif
                     </span>
diff --git a/resources/js/components/Users/Single.vue b/resources/js/components/Users/Single.vue
index 0a605729644cdfd7a27fba935bb8dc4eec90aabc..c32023a22a85fdb583d2017f6e5807fcd94cb2ba 100644
--- a/resources/js/components/Users/Single.vue
+++ b/resources/js/components/Users/Single.vue
@@ -35,8 +35,8 @@
                             <div v-if="$v.user.civility.$error" class="text-danger">Champ obligatoire</div>
                         </div>
                         <div class="form-group">
-                            <label :class="{ 'text-danger': submitted && $v.user.firstname.$error }" for="firstname">Prénom</label>
-                            <i class="text-muted small">(Obligatoire)</i>
+                            <label :class="{ 'text-danger': submitted && $v.user.firstname.$error }" for="firstname">Prénom <i class="text-muted small">(Obligatoire)</i></label>
+
                             <input
                                 id="firstname" v-model="user.firstname"
                                 type="text"
@@ -47,7 +47,7 @@
                         <div class="form-group">
                             <label
                                 :class="{ 'text-danger': submitted && $v.user.lastname.$error }"
-                                for="name">Nom</label> <i class="text-muted small">(Obligatoire)</i>
+                                for="name">Nom <i class="text-muted small">(Obligatoire)</i></label>
                             <input
                                 id="name" v-model="user.lastname"
                                 type="text"
@@ -57,7 +57,7 @@
                         <div class="form-group">
                             <label
                                 :class="{ 'text-danger': submitted && $v.user.email.$error }"
-                                for="email">Email</label> <i class="text-muted small">(Obligatoire)</i>
+                                for="email">Email <i class="text-muted small">(Obligatoire)</i></label>
                             <input
                                 id="email" v-model="user.email"
                                 type="text" class="form-control form-control-sm"
@@ -68,8 +68,7 @@
                             <div v-if="submitted && !$v.user.email.required" class="text-danger">Champ obligatoire</div>
                         </div>
                         <div v-if="!isProfil" class="form-group">
-                            <label :class="{ 'text-danger': submitted && $v.user.role.$error }">Rôle</label> <i
-                                class="text-muted small">(Obligatoire)</i>
+                            <label :class="{ 'text-danger': submitted && $v.user.role.$error }">Rôle <i class="text-muted small">(Obligatoire)</i></label>
                             <div class="form-check">
                                 <input
                                     id="lecteur" v-model="user.role"
@@ -103,8 +102,7 @@
                         </div>
                         <div v-if="isAdmin()" class="form-group">
                             <label
-                                :class="{ 'text-danger': submitted && $v.user.organization_id.$error }">Structure</label>
-                            <i class="text-muted small">(Obligatoire pour les lecteurs et gestionnaires)</i>
+                                :class="{ 'text-danger': submitted && $v.user.organization_id.$error }">Structure <i class="text-muted small">(Obligatoire pour les lecteurs et gestionnaires)</i></label>
                             <select
                                 v-model="user.organization_id" class="form-control"
                                 :class="{ 'is-invalid': submitted && $v.user.organization_id.$error }"
@@ -135,10 +133,11 @@
                             si vous souhaitez définir un nouveau mot de passe</p>
                         <div class="form-group">
                             <label :class="{ 'text-danger': submitted && $v.user.password.$error }" for="password">Mot
-                                de passe</label>
-                            <p class="small" :class="{ 'text-danger': submitted && !$v.user.password.valid }">Le mot de
-                                passe doit contenir au moins un chiffre, une lettre et doit avoir une longueur minimale
-                                de 6 caractères.</p>
+                                de passe
+                                <p class="small mb-0" :class="{ 'text-danger': submitted && !$v.user.password.valid }">Le mot de
+                                    passe doit contenir au moins un chiffre, une lettre minuscule, une lettre majuscule, un caractère spécial et doit avoir une longueur minimale
+                                    de 12 caractères.</p>
+                            </label>
                             <input
                                 id="password" v-model="user.password"
                                 type="password"
@@ -270,13 +269,14 @@ export default {
                 })
             },
             password: {
-                minLength: minLength(6),
+                minLength: minLength(12),
                 valid: function (value) {
                     const length = value ? value.length : 0
                     const containsUppercase = /[A-Z]/.test(value)
                     const containsLowercase = /[a-z]/.test(value)
                     const containsNumber = /[0-9]/.test(value)
-                    return length ? (containsUppercase || containsLowercase) && containsNumber : true
+                    const containsSymbol = /['^£$%&*()}{@#~?!><,|=_+¬-]/.test(value)
+                    return length ? containsUppercase && containsLowercase && containsSymbol && containsNumber : true
                 }
             },
             confirmPassword: {
diff --git a/resources/js/stores/evaluations.js b/resources/js/stores/evaluations.js
index 360d95fdb3c56e87ea016a15101a9eaebf875cf2..61536ae92927a5a81a7fa34e462262a7ca417884 100755
--- a/resources/js/stores/evaluations.js
+++ b/resources/js/stores/evaluations.js
@@ -45,10 +45,12 @@ export default {
             return req
         },
         updateEvaluation ({ commit }, item) {
+            const toast = item.toast
+            delete item.toast
             const req = item.id ? axios.put(`/api/evaluations/${item.id}`, item) : axios.post('/api/evaluations', item)
             req.then(res => {
                 commit('updateEvaluation', res.data)
-                item.id && toaster(this._vm, 'Mise à jour effectuée', 'bg-success', 'check')
+                item.id && toast && toaster(this._vm, 'Mise à jour effectuée', 'bg-success', 'check')
             }).catch(err => {
                 console.log('could not update evaluation', err)
                 commit('setErrors', { errors: err.response.data, status: err.response.status })
diff --git a/resources/js/stores/graphs.js b/resources/js/stores/graphs.js
index 53d23337da62f84a002a1f2242a4886a42f3fb4b..9b9434d3df9f8d73cee9e7d4afdee4420e28f01c 100755
--- a/resources/js/stores/graphs.js
+++ b/resources/js/stores/graphs.js
@@ -19,6 +19,16 @@ export default {
         }
     },
     actions: {
+        async getOrganizationData({commit}, {territoryId}) {
+            const req = await axios.get(`/api/graphs/organizations/${territoryId || ''}`)
+            commit('setGraphData', { name: 'organization', data: req.data, id: 'organization' })
+            return req.data
+        },
+        async getBestMeasures({commit}, {id}) {
+            const req = await axios.get(`/api/evaluations/${id}/graphs/best_measures/`)
+            commit('setGraphData', { name: 'bestMeasures', data: req.data, id })
+            return req.data
+        },
         async getGraphForEvaluation ({ commit }, {name, id}) {
             const req = await axios.get(`/api/evaluations/${id}/graphs/${name}`)
             commit('setGraphData', { name, data: req.data, id })
diff --git a/resources/js/stores/organizations.js b/resources/js/stores/organizations.js
index b1b10cd83024da68f7724e0373d811f111ace584..890c05ca4c0cb09ed75081d7bb6337a4573f055e 100755
--- a/resources/js/stores/organizations.js
+++ b/resources/js/stores/organizations.js
@@ -29,11 +29,15 @@ export default {
             })
             return req
         },
-        updateOrganization ({ commit }, item) {
+        updateOrganization ({ commit, dispatch }, item) {
             const req = item.id ? axios.put(`/api/organizations/${item.id}`, item) : axios.post('/api/organizations', item)
             req.then(res => {
                 commit('updateOrganization', res.data)
                 item.id ? toaster(this._vm, `La structure ${item.name} a été modifiée`, 'bg-success', 'check') : toaster(this._vm, `La structure ${item.name} a été créée`, 'bg-success', 'check')
+                // Update users
+                dispatch('getUsers')
+                // Update evaluations
+                dispatch('getEvaluations')
             }).catch(err => {
                 console.log('could not update org', err)
                 commit('setErrors', { errors: err.response.data, status: err.response.status })
@@ -47,6 +51,8 @@ export default {
                 commit('deleteOrganization', item)
                 // Refresh users to show that some have been deleted
                 dispatch('getUsers')
+                // Refresh evaluations to show that some have been deleted
+                dispatch('getEvaluations')
                 toaster(this._vm, `La structure ${item.name} a été supprimée`, 'bg-info', 'trash')
             }).catch(err => {
                 console.log('could not delete org', err)
diff --git a/resources/js/stores/territories.js b/resources/js/stores/territories.js
index 84d05c4a17cb1fe62a5d1752a968c4c23f840028..6d743e2b039ad0f4462c7cdc8898e93358303bb8 100644
--- a/resources/js/stores/territories.js
+++ b/resources/js/stores/territories.js
@@ -35,7 +35,7 @@ export default {
                 commit('updateTerritory', res.data)
                 dispatch('getOrganizations')
                 dispatch('getTerritories')
-                item.id ? toaster(this._vm, `Le territoire ${item.name} a été modifiée`, 'bg-success', 'check') : toaster(this._vm, `Le territoire ${item.name} a été créée`, 'bg-success', 'check')
+                item.id ? toaster(this._vm, `Le territoire ${item.name} a été modifié`, 'bg-success', 'check') : toaster(this._vm, `Le territoire ${item.name} a été créé`, 'bg-success', 'check')
             }).catch(err => {
                 console.log('could not update ter', err)
                 commit('setErrors', { errors: err.response.data, status: err.response.status })
@@ -49,7 +49,7 @@ export default {
                 commit('deleteTerritory', item)
                 // Refresh users to show that some have been deleted
                 dispatch('getTerritories')
-                toaster(this._vm, `Le territoire ${item.name} a été supprimée`, 'bg-info', 'trash')
+                toaster(this._vm, `Le territoire ${item.name} a été supprimé`, 'bg-info', 'trash')
             }).catch(err => {
                 console.log('could not delete ter', err)
             })
diff --git a/resources/js/stores/user.js b/resources/js/stores/user.js
index c67fbf7868511590b56d823ae22e3b9bf919fef3..5685f4bf19f997199adde885e9b83a9c9af6470f 100644
--- a/resources/js/stores/user.js
+++ b/resources/js/stores/user.js
@@ -27,6 +27,7 @@ export default {
         },
         unsetPreviousUser (state) {
             state.previousUser = null
+            state = {...state, previousUser:null}
             localStorage.removeItem('previousUser')
         }
     },
diff --git a/resources/sass/_variables.scss b/resources/sass/_variables.scss
index cfa796726fb5ecfcbf2462257b328ef3765ad1ae..79416b4d121d9df9fff0ecd6e906a99df14bee91 100644
--- a/resources/sass/_variables.scss
+++ b/resources/sass/_variables.scss
@@ -16,8 +16,9 @@ $sidebar-padding-x: .5rem;
 
 $primary:       #28285B;
 $secondary:     #D7D7DF;
-$success:       #147616;
-$info:          #4281A4;
-$danger:        #D50000;
+$success:       #468355;
+$info:          #427D9F;
+$danger:        #D63F49;
+$warning:       #FFC107;
 $light:         #F4F4F4;
-$dark:          #2A2A22;
+$dark:          #454545;
diff --git a/resources/sass/app.scss b/resources/sass/app.scss
index e25d0ae440bdaeb49b89bf0c63c2ce221f6c7f95..a65bc5898022e309418ccecd5a19ee157b5b91ac 100644
--- a/resources/sass/app.scss
+++ b/resources/sass/app.scss
@@ -9,6 +9,12 @@
 @import '~bootstrap/scss/bootstrap';
 @import '~admin-lte/build/scss/adminlte';
 
+@import '~leaflet/dist/leaflet.css';
+
+
+.bg-grey {
+    background-color : #454545!important;
+}
 
 @media (min-width: 1700px) {
     .modal-xl {
@@ -217,4 +223,17 @@ select.form-control {
 /* GRAPH */
 #attackgraph canvas {
     max-height:600px;
+}
+
+/* DASHBOARD */
+// MARKER CLUSTER
+.marker-cluster {
+    background-color: rgba(40, 40, 91, 0.6)!important;
+    color:white!important;
+}
+.marker-cluster div {
+    background-color: rgba(40, 40, 91, 0.6)!important;
+}
+.marker-cluster span {
+    font-weight: bold;
 }
\ No newline at end of file
diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php
index df4e9249e0bdc9a5ab8e236684a0a10f4af04d9f..aad4dcb5e4f193f01c8acd583a39cf170101b8c7 100755
--- a/resources/views/app.blade.php
+++ b/resources/views/app.blade.php
@@ -13,7 +13,8 @@
 @push('js')
     <script>
         window.referentielVersion = '{{ env('REFERENTIEL_VERSION') }}';
-        window.footerLink = '{{ env('FOOTER_LINK', 'https://www.soluris.fr/') }}';
+        window.seuilAlerte = '{{ env('SEUIL_ALERTE') }}';
+        window.footerLink = '{{ env('MIX_FOOTER_LINK') }}';
         window.logoSidebar = '{{ mix('images/' . env('LOGO_SIDEBAR', 'soluris-logo-white.png')) }}';
         window.appVersion = '';
     </script>
diff --git a/resources/views/pdf/dossierCyberSecurite/chart-bundle.blade.php b/resources/views/pdf/dossierCyberSecurite/chart-bundle.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..7134d267b67b20d61a89e48923696fe00dda64e5
--- /dev/null
+++ b/resources/views/pdf/dossierCyberSecurite/chart-bundle.blade.php
@@ -0,0 +1,7 @@
+/*!
+ * Chart.js v2.9.4
+ * https://www.chartjs.org
+ * (c) 2020 Chart.js Contributors
+ * Released under the MIT License
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Chart=e()}(this,(function(){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function t(){throw new Error("Dynamic requires are not currently supported by rollup-plugin-commonjs")}function e(t,e){return t(e={exports:{}},e.exports),e.exports}var n={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},i=e((function(t){var e={};for(var i in n)n.hasOwnProperty(i)&&(e[n[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=e[t];if(i)return i;var a,r,o,s=1/0;for(var l in n)if(n.hasOwnProperty(l)){var u=n[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d<s&&(s=d,a=l)}return a},a.keyword.rgb=function(t){return n[t]},a.rgb.xyz=function(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));i.rgb,i.hsl,i.hsv,i.hwb,i.cmyk,i.xyz,i.lab,i.lch,i.hex,i.keyword,i.ansi16,i.ansi256,i.hcg,i.apple,i.gray;function a(t){var e=function(){for(var t={},e=Object.keys(i),n=e.length,a=0;a<n;a++)t[e[a]]={distance:-1,parent:null};return t}(),n=[t];for(e[t].distance=0;n.length;)for(var a=n.pop(),r=Object.keys(i[a]),o=r.length,s=0;s<o;s++){var l=r[s],u=e[l];-1===u.distance&&(u.distance=e[a].distance+1,u.parent=a,n.unshift(l))}return e}function r(t,e){return function(n){return e(t(n))}}function o(t,e){for(var n=[e[t].parent,t],a=i[e[t].parent][t],o=e[t].parent;e[o].parent;)n.unshift(e[o].parent),a=r(i[e[o].parent][o],a),o=e[o].parent;return a.conversion=n,a}var s={};Object.keys(i).forEach((function(t){s[t]={},Object.defineProperty(s[t],"channels",{value:i[t].channels}),Object.defineProperty(s[t],"labels",{value:i[t].labels});var e=function(t){for(var e=a(t),n={},i=Object.keys(e),r=i.length,s=0;s<r;s++){var l=i[s];null!==e[l].parent&&(n[l]=o(l,e))}return n}(t);Object.keys(e).forEach((function(n){var i=e[n];s[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a<i;a++)n[a]=Math.round(n[a]);return n};return"conversion"in t&&(e.conversion=t.conversion),e}(i),s[t][n].raw=function(t){var e=function(e){return null==e?e:(arguments.length>1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var l=s,u={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},d={getRgba:h,getHsla:c,getRgb:function(t){var e=h(t);return e&&e.slice(0,3)},getHsl:function(t){var e=c(t);return e&&e.slice(0,3)},getHwb:f,getAlpha:function(t){var e=h(t);if(e)return e[3];if(e=c(t))return e[3];if(e=f(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+b(t[0])+b(t[1])+b(t[2])+(e>=0&&e<1?b(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:g,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return m(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:m,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return y[t.slice(0,3)]}};function h(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(i[r]+i[r],16);a&&(n=Math.round(parseInt(a+a,16)/255*100)/100)}else if(i=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=i[2],i=i[1];for(r=0;r<e.length;r++)e[r]=parseInt(i.slice(2*r,2*r+2),16);a&&(n=Math.round(parseInt(a,16)/255*100)/100)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(i[r+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(i[r+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=u[i[1]]))return}for(r=0;r<e.length;r++)e[r]=v(e[r],0,255);return n=n||0==n?v(n,0,1):1,e[3]=n,e}}function c(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function f(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[v(parseInt(e[1]),0,360),v(parseFloat(e[2]),0,100),v(parseFloat(e[3]),0,100),v(isNaN(n)?1:n,0,1)]}}}function g(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function m(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function v(t,e,n){return Math.min(Math.max(e,t),n)}function b(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y={};for(var x in u)y[u[x]]=x;var _=function(t){return t instanceof _?t:this instanceof _?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=d.getRgba(t))?this.setValues("rgb",e):(e=d.getHsla(t))?this.setValues("hsl",e):(e=d.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new _(t);var e};_.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return d.hexString(this.values.rgb)},rgbString:function(){return d.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return d.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return d.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return d.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return d.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return d.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return d.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new _,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},_.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},_.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},_.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},_.prototype.setValues=function(t,e){var n,i,a=this.values,r=this.spaces,o=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var u=r[t];for(n=0;n<t.length;n++)a[t][n]=e[u[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(n=0;n<t.length;n++)i=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(i);for(var d in r)d!==t&&(a[d]=l[t][d](a[t]));return!0},_.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},_.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=_);var w=_;function k(t){return-1===["__proto__","prototype","constructor"].indexOf(t)}var M,S={noop:function(){},uid:(M=0,function(){return M++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return S.valueOrDefault(S.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(S.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if(S.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(n,t[o[a]],o[a])},arrayEquals:function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!S.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(S.isArray(t))return t.map(S.clone);if(S.isObject(t)){for(var e=Object.create(t),n=Object.keys(t),i=n.length,a=0;a<i;++a)e[n[a]]=S.clone(t[n[a]]);return e}return t},_merger:function(t,e,n,i){if(k(t)){var a=e[t],r=n[t];S.isObject(a)&&S.isObject(r)?S.merge(a,r,i):e[t]=S.clone(r)}},_mergerIf:function(t,e,n){if(k(t)){var i=e[t],a=n[t];S.isObject(i)&&S.isObject(a)?S.mergeIf(i,a):e.hasOwnProperty(t)||(e[t]=S.clone(a))}},merge:function(t,e,n){var i,a,r,o,s,l=S.isArray(e)?e:[e],u=l.length;if(!S.isObject(t))return t;for(i=(n=n||{}).merger||S._merger,a=0;a<u;++a)if(e=l[a],S.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)i(r[s],t,e,n);return t},mergeIf:function(t,e){return S.merge(t,e,{merger:S._mergerIf})},extend:Object.assign||function(t){return S.merge(t,[].slice.call(arguments,1),{merger:function(t,e,n){e[t]=n[t]}})},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=S.inherits,t&&S.extend(n.prototype,t),n.__super__=e.prototype,n},_deprecated:function(t,e,n,i){void 0!==e&&console.warn(t+': "'+n+'" is deprecated. Please use "'+i+'" instead')}},D=S;S.callCallback=S.callback,S.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},S.getValueOrDefault=S.valueOrDefault,S.getValueAtIndexOrDefault=S.valueAtIndexOrDefault;var C={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-C.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*C.easeInBounce(2*t):.5*C.easeOutBounce(2*t-1)+.5}},P={effects:C};D.easingEffects=C;var T=Math.PI,O=T/180,A=2*T,F=T/2,I=T/4,L=2*T/3,R={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-T,-F),t.arc(u,l,o,-F,0),t.arc(u,d,o,0,F),t.arc(s,d,o,F,T)):s<u?(t.moveTo(s,n),t.arc(u,l,o,-F,F),t.arc(s,l,o,F,T+F)):l<d?(t.arc(s,l,o,-T,0),t.arc(s,d,o,0,T)):t.arc(s,l,o,-T,T),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h=(r||0)*O;if(e&&"object"==typeof e&&("[object HTMLImageElement]"===(o=e.toString())||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,a),t.rotate(h),t.drawImage(e,-e.width/2,-e.height/2,e.width,e.height),void t.restore();if(!(isNaN(n)||n<=0)){switch(t.beginPath(),e){default:t.arc(i,a,n,0,A),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=L,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),t.closePath();break;case"rectRounded":u=n-(d=.516*n),s=Math.cos(h+I)*u,l=Math.sin(h+I)*u,t.arc(i-s,a-l,d,h-T,h-F),t.arc(i+l,a-s,d,h-F,h),t.arc(i+s,a+l,d,h,h+F),t.arc(i-l,a+s,d,h+F,h+T),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*n,t.rect(i-u,a-u,2*u,2*u);break}h+=I;case"rectRot":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+l,a-s),t.lineTo(i+s,a+l),t.lineTo(i-l,a+s),t.closePath();break;case"crossRot":h+=I;case"cross":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"star":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s),h+=I,s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"line":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l);break;case"dash":t.moveTo(i,a),t.lineTo(i+Math.cos(h)*n,a+Math.sin(h)*n)}t.fill(),t.stroke()}},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){var a=n.steppedLine;if(a){if("middle"===a){var r=(e.x+n.x)/2;t.lineTo(r,i?n.y:e.y),t.lineTo(r,i?e.y:n.y)}else"after"===a&&!i||"after"!==a&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y);t.lineTo(n.x,n.y)}else n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}},N=R;D.clear=R.clear,D.drawRoundedRectangle=function(t){t.beginPath(),R.roundedRect.apply(R,arguments)};var W={_set:function(t,e){return D.merge(this[t]||(this[t]={}),e)}};W._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var Y=W,z=D.valueOrDefault;var E={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,i,a;return D.isObject(t)?(e=+t.top||0,n=+t.right||0,i=+t.bottom||0,a=+t.left||0):e=n=i=a=+t||0,{top:e,right:n,bottom:i,left:a,height:e+i,width:a+n}},_parseFont:function(t){var e=Y.global,n=z(t.fontSize,e.defaultFontSize),i={family:z(t.fontFamily,e.defaultFontFamily),lineHeight:D.options.toLineHeight(z(t.lineHeight,e.defaultLineHeight),n),size:n,style:z(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return i.string=function(t){return!t||D.isNullOrUndef(t.size)||D.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i},resolve:function(t,e,n,i){var a,r,o,s=!0;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&"function"==typeof o&&(o=o(e),s=!1),void 0!==n&&D.isArray(o)&&(o=o[n],s=!1),void 0!==o))return i&&!s&&(i.cacheable=!1),o}},V={_factorize:function(t){var e,n=[],i=Math.sqrt(t);for(e=1;e<i;e++)t%e==0&&(n.push(e),n.push(t/e));return i===(0|i)&&n.push(i),n.sort((function(t,e){return t-e})).pop(),n},log10:Math.log10||function(t){var e=Math.log(t)*Math.LOG10E,n=Math.round(e);return t===Math.pow(10,n)?n:e}},H=V;D.log10=V.log10;var B=D,j=P,U=N,G=E,q=H,Z={getRtlAdapter:function(t,e,n){return t?function(t,e){return{x:function(n){return t+t+e-n},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}}(e,n):{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}},overrideTextDirection:function(t,e){var n,i;"ltr"!==e&&"rtl"!==e||(i=[(n=t.canvas.style).getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=i)},restoreTextDirection:function(t){var e=t.prevTextDirection;void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}};B.easing=j,B.canvas=U,B.options=G,B.math=q,B.rtl=Z;var $=function(t){B.extend(this,t),this.initialize.apply(this,arguments)};B.extend($.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=B.extend({},t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,i=e._start,a=e._view;return n&&1!==t?(a||(a=e._view={}),i||(i=e._start={}),function(t,e,n,i){var a,r,o,s,l,u,d,h,c,f=Object.keys(n);for(a=0,r=f.length;a<r;++a)if(u=n[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)===typeof(l=t[o]))if("string"===d){if((h=w(l)).valid&&(c=w(u)).valid){e[o]=c.mix(h,i).rgbString();continue}}else if(B.isFinite(l)&&B.isFinite(u)){e[o]=l+(u-l)*i;continue}e[o]=u}}(i,a,n,t),e):(e._view=B.extend({},n),e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return B.isNumber(this._model.x)&&B.isNumber(this._model.y)}}),$.extend=B.inherits;var X=$,K=X.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),J=K;Object.defineProperty(K.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(K.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),Y._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:B.noop,onComplete:B.noop}});var Q={animations:[],request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=n,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=B.findIndex(this.animations,(function(e){return e.chart===t}));-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=B.requestAnimFrame.call(window,(function(){t.request=null,t.startDigest()})))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,n=t.numSteps,i=Math.floor((Date.now()-t.startTime)/t.duration*n)+1,t.currentStep=Math.min(i,n),B.callback(t.render,[e,t],e),B.callback(t.onAnimationProgress,[t],e),t.currentStep>=n?(B.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},tt=B.options.resolve,et=["push","pop","shift","splice","unshift"];function nt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(et.forEach((function(e){delete t[e]})),delete t._chartjs)}}var it=function(t,e){this.initialize(t,e)};B.extend(it.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&nt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);n.dataset=n.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,n=this,i=n.getDataset(),a=i.data||(i.data=[]);n._data!==a&&(n._data&&nt(n._data,n),a&&Object.isExtensible(a)&&(e=n,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),et.forEach((function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=i.apply(this,e);return B.each(t._chartjs.listeners,(function(t){"function"==typeof t[n]&&t[n].apply(t,e)})),a}})})))),n._data=a),n.resyncElements()},_configure:function(){this._config=B.merge(Object.create(null),[this.chart.options.datasets[this._type],this.getDataset()],{merger:function(t,e,n){"_meta"!==t&&"data"!==t&&B._merger(t,e,n)}})},_update:function(t){this._configure(),this._cachedDataOpts=null,this.update(t)},update:B.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},getStyle:function(t){var e,n=this.getMeta(),i=n.dataset;return this._configure(),i&&void 0===t?e=this._resolveDatasetElementOptions(i||{}):(t=t||0,e=this._resolveDataElementOptions(n.data[t]||{},t)),!1!==e.fill&&null!==e.fill||(e.backgroundColor=e.borderColor),e},_resolveDatasetElementOptions:function(t,e){var n,i,a,r,o=this,s=o.chart,l=o._config,u=t.custom||{},d=s.options.elements[o.datasetElementType.prototype._type]||{},h=o._datasetElementOptions,c={},f={chart:s,dataset:o.getDataset(),datasetIndex:o.index,hover:e};for(n=0,i=h.length;n<i;++n)a=h[n],r=e?"hover"+a.charAt(0).toUpperCase()+a.slice(1):a,c[a]=tt([u[r],l[r],d[r]],f);return c},_resolveDataElementOptions:function(t,e){var n=this,i=t&&t.custom,a=n._cachedDataOpts;if(a&&!i)return a;var r,o,s,l,u=n.chart,d=n._config,h=u.options.elements[n.dataElementType.prototype._type]||{},c=n._dataElementOptions,f={},g={chart:u,dataIndex:e,dataset:n.getDataset(),datasetIndex:n.index},m={cacheable:!i};if(i=i||{},B.isArray(c))for(o=0,s=c.length;o<s;++o)f[l=c[o]]=tt([i[l],d[l],h[l]],g,e,m);else for(o=0,s=(r=Object.keys(c)).length;o<s;++o)f[l=r[o]]=tt([i[l],d[c[l]],d[l],h[l]],g,e,m);return m.cacheable&&(n._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(t){B.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=B.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=tt([i.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,n),a.borderColor=tt([i.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,n),a.borderWidth=tt([i.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,n)},_removeDatasetHoverStyle:function(){var t=this.getMeta().dataset;t&&this.removeHoverStyle(t)},_setDatasetHoverStyle:function(){var t,e,n,i,a,r,o=this.getMeta().dataset,s={};if(o){for(r=o._model,a=this._resolveDatasetElementOptions(o,!0),t=0,e=(i=Object.keys(a)).length;t<e;++t)s[n=i[t]]=r[n],r[n]=a[n];o.$previousStyle=s}},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,n=t.data.length,i=e.length;i<n?t.data.splice(i,n-i):i>n&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),it.extend=B.inherits;var at=it,rt=2*Math.PI;function ot(t,e){var n=e.startAngle,i=e.endAngle,a=e.pixelMargin,r=a/e.outerRadius,o=e.x,s=e.y;t.beginPath(),t.arc(o,s,e.outerRadius,n-r,i+r),e.innerRadius>a?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function st(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+rt,ot(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=rt,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+rt,n.startAngle,!0),a=0;a<n.fullCircles;++a)t.stroke();for(t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.startAngle+rt),a=0;a<n.fullCircles;++a)t.stroke()}(t,e,n,i),i&&ot(t,n),t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.endAngle),t.arc(n.x,n.y,n.innerRadius,n.endAngle,n.startAngle,!0),t.closePath(),t.stroke()}Y._set("global",{elements:{arc:{backgroundColor:Y.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var lt=X.extend({_type:"arc",inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=B.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,o=n.startAngle,s=n.endAngle;s<o;)s+=rt;for(;a>s;)a-=rt;for(;a<o;)a+=rt;var l=a>=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/rt)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+rt,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;t<a.fullCircles;++t)e.fill();a.endAngle=a.startAngle+n.circumference%rt}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),n.borderWidth&&st(e,n,a),e.restore()}}),ut=B.valueOrDefault,dt=Y.global.defaultColor;Y._set("global",{elements:{line:{tension:.4,backgroundColor:dt,borderWidth:3,borderColor:dt,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var ht=X.extend({_type:"line",draw:function(){var t,e,n,i=this,a=i._view,r=i._chart.ctx,o=a.spanGaps,s=i._children.slice(),l=Y.global,u=l.elements.line,d=-1,h=i._loop;if(s.length){if(i._loop){for(t=0;t<s.length;++t)if(e=B.previousItem(s,t),!s[t]._view.skip&&e._view.skip){s=s.slice(t).concat(s.slice(0,t)),h=o;break}h&&s.push(s[0])}for(r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=ut(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=ut(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),(n=s[0]._view).skip||(r.moveTo(n.x,n.y),d=0),t=1;t<s.length;++t)n=s[t]._view,e=-1===d?B.previousItem(s,t):s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):B.canvas.lineTo(r,e._view,n),d=t);h&&r.closePath(),r.stroke(),r.restore()}}}),ct=B.valueOrDefault,ft=Y.global.defaultColor;function gt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}Y._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:ft,borderColor:ft,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var mt=X.extend({_type:"point",inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:gt,inXRange:gt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._chart.ctx,i=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=Y.global,u=l.defaultColor;e.skip||(void 0===t||B.canvas._isPointInArea(e,t))&&(n.strokeStyle=e.borderColor||u,n.lineWidth=ct(e.borderWidth,l.elements.point.borderWidth),n.fillStyle=e.backgroundColor||u,B.canvas.drawPoint(n,i,r,o,s,a))}}),pt=Y.global.defaultColor;function vt(t){return t&&void 0!==t.width}function bt(t){var e,n,i,a,r;return vt(t)?(r=t.width/2,e=t.x-r,n=t.x+r,i=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),n=Math.max(t.x,t.base),i=t.y-r,a=t.y+r),{left:e,top:i,right:n,bottom:a}}function yt(t,e,n){return t===e?n:t===n?e:t}function xt(t,e,n){var i,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,n={};return e?(t.horizontal?t.base>t.x&&(e=yt(e,"left","right")):t.base<t.y&&(e=yt(e,"bottom","top")),n[e]=!0,n):n}(t);return B.isObject(s)?(i=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):i=a=r=o=+s||0,{t:l.top||i<0?0:i>n?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function _t(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&bt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}Y._set("global",{elements:{rectangle:{backgroundColor:pt,borderColor:pt,borderSkipped:"bottom",borderWidth:0}}});var wt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=bt(t),n=e.right-e.left,i=e.bottom-e.top,a=xt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return _t(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return vt(n)?_t(n,t,null):_t(n,null,e)},inXRange:function(t){return _t(this._view,t,null)},inYRange:function(t){return _t(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return vt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return vt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),kt={},Mt=lt,St=ht,Dt=mt,Ct=wt;kt.Arc=Mt,kt.Line=St,kt.Point=Dt,kt.Rectangle=Ct;var Pt=B._deprecated,Tt=B.valueOrDefault;function Ot(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=B.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=t.getTicks().length;a<r;++a)i=t.getPixelForTick(a),o=a>0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return B.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}Y._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),Y._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var At=at.extend({dataElementType:kt.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;at.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Pt("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Pt("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Pt("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Pt("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Pt("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e<n;++e)this.updateElement(i[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=i.getDataset(),o=i._resolveDataElementOptions(t,e);t._xScale=i.getScaleForId(a.xAxisID),t._yScale=i.getScaleForId(a.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:i.chart.data.labels[e]},B.isArray(r.data[e])&&(t._model.borderSkipped=null),i._updateElementGeometry(t,e,n,o),t.pivot()},_updateElementGeometry:function(t,e,n,i){var a=this,r=t._model,o=a._getValueScale(),s=o.getBasePixel(),l=o.isHorizontal(),u=a._ruler||a.getRuler(),d=a.calculateBarValuePixels(a.index,e,i),h=a.calculateBarIndexPixels(a.index,e,u,i);r.horizontal=l,r.base=n?s:d.base,r.x=l?n?s:d.head:h.center,r.y=l?h.center:n?s:d.head,r.height=l?h.size:void 0,r.width=l?void 0:h.size},_getStacks:function(t){var e,n,i=this._getIndexScale(),a=i._getMatchingVisibleMetas(this._type),r=i.options.stacked,o=a.length,s=[];for(e=0;e<o&&(n=a[e],(!1===r||-1===s.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&s.push(n.stack),n.index!==t);++e);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var n=this._getStacks(t),i=void 0!==e?n.indexOf(e):-1;return-1===i?n.length-1:i},getRuler:function(){var t,e,n=this._getIndexScale(),i=[];for(t=0,e=this.getMeta().data.length;t<e;++t)i.push(n.getPixelForValue(null,t,this.index));return{pixels:i,start:n._startPixel,end:n._endPixel,stackCount:this.getStackCount(),scale:n}},calculateBarValuePixels:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._getValueScale(),c=h.isHorizontal(),f=d.data.datasets,g=h._getMatchingVisibleMetas(this._type),m=h._parseValue(f[t].data[e]),p=n.minBarLength,v=h.options.stacked,b=this.getMeta().stack,y=void 0===m.start?0:m.max>=0&&m.min>=0?m.min:m.max,x=void 0===m.start?m.end:m.max>=0&&m.min>=0?m.max-m.min:m.min-m.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(m.min<0&&r<0||m.max>=0&&r>0)&&(y+=r));return o=h.getPixelForValue(y),l=(s=h.getPixelForValue(y+x))-o,void 0!==p&&Math.abs(l)<p&&(l=p,s=x>=0&&!c||x<0&&c?o-p:o+p),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=n.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),i=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:n.barPercentage,start:i}}(e,n,i):Ot(e,n,i),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(Tt(i.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),n=this.getMeta().data,i=this.getDataset(),a=n.length,r=0;for(B.canvas.clipArea(t.ctx,t.chartArea);r<a;++r){var o=e._parseValue(i.data[r]);isNaN(o.min)||isNaN(o.max)||n[r].draw()}B.canvas.unclipArea(t.ctx)},_resolveDataElementOptions:function(){var t=this,e=B.extend({},at.prototype._resolveDataElementOptions.apply(t,arguments)),n=t._getIndexScale().options,i=t._getValueScale().options;return e.barPercentage=Tt(n.barPercentage,e.barPercentage),e.barThickness=Tt(n.barThickness,e.barThickness),e.categoryPercentage=Tt(n.categoryPercentage,e.categoryPercentage),e.maxBarThickness=Tt(n.maxBarThickness,e.maxBarThickness),e.minBarLength=Tt(i.minBarLength,e.minBarLength),e}}),Ft=B.valueOrDefault,It=B.options.resolve;Y._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}});var Lt=at.extend({dataElementType:kt.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(t){var e=this,n=e.getMeta().data;B.each(n,(function(n,i){e.updateElement(n,i,t)}))},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveDataElementOptions(t,e),u=i.getDataset().data[e],d=i.index,h=n?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:n?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ft(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Ft(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Ft(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},_resolveDataElementOptions:function(t,e){var n=this,i=n.chart,a=n.getDataset(),r=t.custom||{},o=a.data[e]||{},s=at.prototype._resolveDataElementOptions.apply(n,arguments),l={chart:i,dataIndex:e,dataset:a,datasetIndex:n.index};return n._cachedDataOpts===s&&(s=B.extend({},s)),s.radius=It([r.radius,o.r,n._config.radius,i.options.elements.point.radius],l,e),s}}),Rt=B.valueOrDefault,Nt=Math.PI,Wt=2*Nt,Yt=Nt/2;Y._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-Yt,circumference:Wt,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return B.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}});var zt=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e,n,i,a,r=this,o=r.chart,s=o.chartArea,l=o.options,u=1,d=1,h=0,c=0,f=r.getMeta(),g=f.data,m=l.cutoutPercentage/100||0,p=l.circumference,v=r._getRingWeight(r.index);if(p<Wt){var b=l.rotation%Wt,y=(b+=b>=Nt?-Wt:b<-Nt?Wt:0)+p,x=Math.cos(b),_=Math.sin(b),w=Math.cos(y),k=Math.sin(y),M=b<=0&&y>=0||y>=Wt,S=b<=Yt&&y>=Yt||y>=Wt+Yt,D=b<=-Yt&&y>=-Yt||y>=Nt+Yt,C=b===-Nt||y>=Nt?-1:Math.min(x,x*m,w,w*m),P=D?-1:Math.min(_,_*m,k,k*m),T=M?1:Math.max(x,x*m,w,w*m),O=S?1:Math.max(_,_*m,k,k*m);u=(T-C)/2,d=(O-P)/2,h=-(T+C)/2,c=-(O+P)/2}for(i=0,a=g.length;i<a;++i)g[i]._options=r._resolveDataElementOptions(g[i],i);for(o.borderWidth=r.getMaxBorderWidth(),e=(s.right-s.left-o.borderWidth)/u,n=(s.bottom-s.top-o.borderWidth)/d,o.outerRadius=Math.max(Math.min(e,n)/2,0),o.innerRadius=Math.max(o.outerRadius*m,0),o.radiusLength=(o.outerRadius-o.innerRadius)/(r._getVisibleDatasetWeightTotal()||1),o.offsetX=h*o.outerRadius,o.offsetY=c*o.outerRadius,f.total=r.calculateTotal(),r.outerRadius=o.outerRadius-o.radiusLength*r._getRingWeightOffset(r.index),r.innerRadius=Math.max(r.outerRadius-o.radiusLength*v,0),i=0,a=g.length;i<a;++i)r.updateElement(g[i],i,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=i.getDataset(),f=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(c.data[e])*(o.circumference/Wt),g=n&&s.animateScale?0:i.innerRadius,m=n&&s.animateScale?0:i.outerRadius,p=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_model:{backgroundColor:p.backgroundColor,borderColor:p.borderColor,borderWidth:p.borderWidth,borderAlign:p.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:m,innerRadius:g,label:B.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;n&&s.animateRotate||(v.startAngle=0===e?o.rotation:i.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return B.each(n.data,(function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))})),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?Wt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e<n;++e)if(d.isDatasetVisible(e)){t=(i=d.getDatasetMeta(e)).data,e!==this.index&&(r=i.controller);break}if(!t)return 0;for(e=0,n=t.length;e<n;++e)a=t[e],r?(r._configure(),o=r._resolveDataElementOptions(a,e)):o=a._options,"inner"!==o.borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Rt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Rt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Rt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(e+=this._getRingWeight(n));return e},_getRingWeight:function(t){return Math.max(Rt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});Y._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),Y._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Et=At.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Vt=B.valueOrDefault,Ht=B.options.resolve,Bt=B.canvas._isPointInArea;function jt(t,e){var n=t&&t.options.ticks||{},i=n.reverse,a=void 0===n.min?e:0,r=void 0===n.max?e:0;return{start:i?r:a,end:i?a:r}}function Ut(t,e,n){var i=n/2,a=jt(t,i),r=jt(e,i);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}function Gt(t){var e,n,i,a;return B.isObject(t)?(e=t.top,n=t.right,i=t.bottom,a=t.left):e=n=i=a=t,{top:e,right:n,bottom:i,left:a}}Y._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var qt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.options,l=i._config,u=i._showLine=Vt(l.showLine,s.showLines);for(i._xScale=i.getScaleForId(a.xAxisID),i._yScale=i.getScaleForId(a.yAxisID),u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=i._yScale,r._datasetIndex=i.index,r._children=o,r._model=i._resolveDatasetElementOptions(r),r.pivot()),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r._xScale,c=r._yScale,f=o.dataset._model,g=r._resolveDataElementOptions(t,e);i=h.getPixelForValue("object"==typeof d?d:NaN,e,u),a=n?c.getBasePixel():r.calculatePointY(d,e,u),t._xScale=h,t._yScale=c,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Vt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolveDatasetElementOptions:function(t){var e=this,n=e._config,i=t.custom||{},a=e.chart.options,r=a.elements.line,o=at.prototype._resolveDatasetElementOptions.apply(e,arguments);return o.spanGaps=Vt(n.spanGaps,a.spanGaps),o.tension=Vt(n.lineTension,r.tension),o.steppedLine=Ht([i.steppedLine,n.steppedLine,r.stepped]),o.clip=Gt(Vt(n.clip,Ut(e._xScale,e._yScale,o.borderWidth))),o},calculatePointY:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._yScale,c=0,f=0;if(h.options.stacked){for(s=+h.getRightValue(t),u=(l=d._getSortedVisibleDatasetMetas()).length,i=0;i<u&&(r=l[i]).index!==n;++i)a=d.data.datasets[r.index],"line"===r.type&&r.yAxisID===h.id&&((o=+h.getRightValue(a.data[e]))<0?f+=o||0:c+=o||0);return s<0?h.getPixelForValue(f+s):h.getPixelForValue(c+s)}return h.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,n,i,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,n){return Math.max(Math.min(t,n),e)}if(o.spanGaps&&(l=l.filter((function(t){return!t._model.skip}))),"monotone"===o.cubicInterpolationMode)B.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)n=l[t]._model,i=B.splineCurve(B.previousItem(l,t)._model,n,B.nextItem(l,t)._model,o.tension),n.controlPointPreviousX=i.previous.x,n.controlPointPreviousY=i.previous.y,n.controlPointNextX=i.next.x,n.controlPointNextY=i.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)n=l[t]._model,Bt(n,s)&&(t>0&&Bt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&Bt(l[t+1]._model,s)&&(n.controlPointNextX=u(n.controlPointNextX,s.left,s.right),n.controlPointNextY=u(n.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,n=this.getMeta(),i=n.data||[],a=e.chartArea,r=e.canvas,o=0,s=i.length;for(this._showLine&&(t=n.dataset._model.clip,B.canvas.clipArea(e.ctx,{left:!1===t.left?0:a.left-t.left,right:!1===t.right?r.width:a.right+t.right,top:!1===t.top?0:a.top-t.top,bottom:!1===t.bottom?r.height:a.bottom+t.bottom}),n.dataset.draw(),B.canvas.unclipArea(e.ctx));o<s;++o)i[o].draw(a)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Vt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Vt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Vt(n.hoverBorderWidth,n.borderWidth),e.radius=Vt(n.hoverRadius,n.radius)}}),Zt=B.options.resolve;Y._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var $t=at.extend({dataElementType:kt.Arc,linkScales:B.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,n=r.data.length;e<n;e++)l[e]=s,i=a._computeAngle(e),u[e]=i,s+=i;for(e=0,n=d.length;e<n;++e)d[e]._options=a._resolveDataElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,n=e.chartArea,i=e.options,a=Math.min(n.right-n.left,n.bottom-n.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(i.cutoutPercentage?e.outerRadius/100*i.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=i._starts[e],m=g+(t.hidden?0:i._angles[e]),p=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};B.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:n?p:f,startAngle:n&&s.animateRotate?c:g,endAngle:n&&s.animateRotate?c:m,label:B.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return B.each(e.data,(function(e,i){isNaN(t.data[i])||e.hidden||n++})),n},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor,a=B.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=a(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=a(n.hoverBorderWidth,n.borderWidth)},_computeAngle:function(t){var e=this,n=this.getMeta().count,i=e.getDataset(),a=e.getMeta();if(isNaN(i.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:i,datasetIndex:e.index};return Zt([e.chart.options.elements.arc.angle,2*Math.PI/n],r,t)}});Y._set("pie",B.clone(Y.doughnut)),Y._set("pie",{cutoutPercentage:0});var Xt=zt,Kt=B.valueOrDefault;Y._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var Jt=at.extend({datasetElementType:kt.Line,dataElementType:kt.Point,linkScales:B.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.scale,l=i._config;for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=i.index,r._children=o,r._loop=!0,r._model=i._resolveDatasetElementOptions(r),r.pivot(),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),o=i.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=i._resolveDataElementOptions(t,e),u=i.getMeta().dataset._model,d=n?o.xCenter:s.x,h=n?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=i.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Kt(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var t=this,e=t._config,n=t.chart.options,i=at.prototype._resolveDatasetElementOptions.apply(t,arguments);return i.spanGaps=Kt(e.spanGaps,n.spanGaps),i.tension=Kt(e.lineTension,n.elements.line.tension),i},updateBezierControlPoints:function(){var t,e,n,i,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,n){return Math.max(Math.min(t,n),e)}for(a.dataset._model.spanGaps&&(o=o.filter((function(t){return!t._model.skip}))),t=0,e=o.length;t<e;++t)n=o[t]._model,i=B.splineCurve(B.previousItem(o,t,!0)._model,n,B.nextItem(o,t,!0)._model,n.tension),n.controlPointPreviousX=s(i.previous.x,r.left,r.right),n.controlPointPreviousY=s(i.previous.y,r.top,r.bottom),n.controlPointNextX=s(i.next.x,r.left,r.right),n.controlPointNextY=s(i.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,n=t._options,i=B.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Kt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Kt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Kt(n.hoverBorderWidth,n.borderWidth),e.radius=Kt(n.hoverRadius,n.radius)}});Y._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),Y._set("global",{datasets:{scatter:{showLine:!1}}});var Qt={bar:At,bubble:Lt,doughnut:zt,horizontalBar:Et,line:qt,polarArea:$t,pie:Xt,radar:Jt,scatter:qt};function te(t,e){return t.native?{x:t.x,y:t.y}:B.getRelativePosition(t,e)}function ee(t,e){var n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas();for(i=0,r=l.length;i<r;++i)for(a=0,o=(n=l[i].data).length;a<o;++a)(s=n[a])._view.skip||e(s)}function ne(t,e){var n=[];return ee(t,(function(t){t.inRange(e.x,e.y)&&n.push(t)})),n}function ie(t,e,n,i){var a=Number.POSITIVE_INFINITY,r=[];return ee(t,(function(t){if(!n||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=i(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}})),r}function ae(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function re(t,e,n){var i=te(e,t);n.axis=n.axis||"x";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a),o=[];return r.length?(t._getSortedVisibleDatasetMetas().forEach((function(t){var e=t.data[r[0]._index];e&&!e._view.skip&&o.push(e)})),o):[]}var oe={modes:{single:function(t,e){var n=te(e,t),i=[];return ee(t,(function(t){if(t.inRange(n.x,n.y))return i.push(t),i})),i.slice(0,1)},label:re,index:re,dataset:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis),r=n.intersect?ne(t,i):ie(t,i,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return re(t,e,{intersect:!1})},point:function(t,e){return ne(t,te(e,t))},nearest:function(t,e,n){var i=te(e,t);n.axis=n.axis||"xy";var a=ae(n.axis);return ie(t,i,n.intersect,a)},x:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=te(e,t),a=[],r=!1;return ee(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},se=B.extend;function le(t,e){return B.where(t,(function(t){return t.pos===e}))}function ue(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function de(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function he(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-de(o,t,"left","right"),a=e.outerHeight-de(o,t,"top","bottom"),i!==t.w||a!==t.h){t.w=i,t.h=a;var l=n.horizontal?[i,t.w]:[a,t.h];return!(l[0]===l[1]||isNaN(l[0])&&isNaN(l[1]))}}function ce(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function fe(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;i<a;++i)(o=(r=t[i]).box).update(r.width||e.w,r.height||e.h,ce(r.horizontal,e)),he(e,n,r)&&(l=!0,u.length&&(s=!0)),o.fullWidth||u.push(r);return s&&fe(u,e,n)||l}function ge(t,e,n){var i,a,r,o,s=n.padding,l=e.x,u=e.y;for(i=0,a=t.length;i<a;++i)o=(r=t[i]).box,r.horizontal?(o.left=o.fullWidth?s.left:e.left,o.right=o.fullWidth?n.outerWidth-s.right:e.left+e.w,o.top=u,o.bottom=u+o.height,o.width=o.right-o.left,u=o.bottom):(o.left=l,o.right=l+o.width,o.top=e.top,o.bottom=e.top+e.h,o.height=o.bottom-o.top,l=o.right);e.x=l,e.y=u}Y._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var me,pe={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw:function(){e.draw.apply(e,arguments)}}]},t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,e,n){if(t){var i=t.options.layout||{},a=B.options.toPadding(i.padding),r=e-a.width,o=n-a.height,s=function(t){var e=function(t){var e,n,i,a=[];for(e=0,n=(t||[]).length;e<n;++e)i=t[e],a.push({index:e,box:i,pos:i.position,horizontal:i.isHorizontal(),weight:i.weight});return a}(t),n=ue(le(e,"left"),!0),i=ue(le(e,"right")),a=ue(le(e,"top"),!0),r=ue(le(e,"bottom"));return{leftAndTop:n.concat(a),rightAndBottom:i.concat(r),chartArea:le(e,"chartArea"),vertical:n.concat(i),horizontal:a.concat(r)}}(t.boxes),l=s.vertical,u=s.horizontal,d=Object.freeze({outerWidth:e,outerHeight:n,padding:a,availableWidth:r,vBoxMaxWidth:r/2/l.length,hBoxMaxHeight:o/2}),h=se({maxPadding:se({},a),w:r,h:o,x:a.left,y:a.top},a);!function(t,e){var n,i,a;for(n=0,i=t.length;n<i;++n)(a=t[n]).width=a.horizontal?a.box.fullWidth&&e.availableWidth:e.vBoxMaxWidth,a.height=a.horizontal&&e.hBoxMaxHeight}(l.concat(u),d),fe(l,h,d),fe(u,h,d)&&fe(l,h,d),function(t){var e=t.maxPadding;function n(n){var i=Math.max(e[n]-t[n],0);return t[n]+=i,i}t.y+=n("top"),t.x+=n("left"),n("right"),n("bottom")}(h),ge(s.leftAndTop,h,d),h.x+=h.w,h.y+=h.h,ge(s.rightAndBottom,h,d),t.chartArea={left:h.left,top:h.top,right:h.left+h.w,bottom:h.top+h.h},B.each(s.chartArea,(function(e){var n=e.box;se(n,t.chartArea),n.update(h.w,h.h)}))}}},ve=(me=Object.freeze({__proto__:null,default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&me.default||me,be="$chartjs",ye="chartjs-size-monitor",xe="chartjs-render-monitor",_e="chartjs-render-animation",we=["animationstart","webkitAnimationStart"],ke={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function Me(t,e){var n=B.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var Se=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function De(t,e,n){t.addEventListener(e,n,Se)}function Ce(t,e,n){t.removeEventListener(e,n,Se)}function Pe(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Te(t){var e=document.createElement("div");return e.className=t||"",e}function Oe(t,e,n){var i,a,r,o,s=t[be]||(t[be]={}),l=s.resizer=function(t){var e=Te(ye),n=Te(ye+"-expand"),i=Te(ye+"-shrink");n.appendChild(Te()),i.appendChild(Te()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return De(n,"scroll",a.bind(n,"expand")),De(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Pe("resize",n)),i&&i.clientWidth<a&&n.canvas&&e(Pe("resize",n))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,B.requestAnimFrame.call(window,(function(){r=!1,i.apply(a,o)})))}));!function(t,e){var n=t[be]||(t[be]={}),i=n.renderProxy=function(t){t.animationName===_e&&e()};B.each(we,(function(e){De(t,e,i)})),n.reflow=!!t.offsetParent,t.classList.add(xe)}(t,(function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}}))}function Ae(t){var e=t[be]||{},n=e.resizer;delete e.resizer,function(t){var e=t[be]||{},n=e.renderProxy;n&&(B.each(we,(function(e){Ce(t,e,n)})),delete e.renderProxy),t.classList.remove(xe)}(t),n&&n.parentNode&&n.parentNode.removeChild(n)}var Fe={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(t){if(!this.disableCSSInjection){var e=t.getRootNode?t.getRootNode():document;!function(t,e){var n=t[be]||(t[be]={});if(!n.containsStyles){n.containsStyles=!0,e="/* Chart.js */\n"+e;var i=document.createElement("style");i.setAttribute("type","text/css"),i.appendChild(document.createTextNode(e)),t.appendChild(i)}}(e.host?e:document.head,ve)}},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(this._ensureLoaded(t),function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t[be]={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=Me(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=Me(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[be]){var n=e[be].initial;["height","width"].forEach((function(t){var i=n[t];B.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)})),B.each(n.style||{},(function(t,n){e.style[n]=t})),e.width=e.width,delete e[be]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[be]||(n[be]={});De(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(function(t,e){var n=ke[t.type]||t.type,i=B.getRelativePosition(t,e);return Pe(n,e,i.x,i.y,t)}(e,t))})}else Oe(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[be]||{}).proxies||{})[t.id+"_"+e];a&&Ce(i,e,a)}else Ae(i)}};B.addEvent=De,B.removeEvent=Ce;var Ie=Fe._enabled?Fe:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Le=B.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Ie);Y._set("global",{plugins:{}});var Re={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach((function(t){-1===e.indexOf(t)&&e.push(t)})),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach((function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)})),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if("function"==typeof(s=(r=(a=l[i]).plugin)[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],i=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach((function(t){if(-1===n.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=B.clone(Y.global.plugins[e])),n.push(t),i.push({plugin:t,options:a||{}}))}})),e.descriptors=i,e.id=this._cacheId,i},_invalidate:function(t){delete t.$plugins}},Ne={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=B.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?B.merge(Object.create(null),[Y.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=B.extend(this.defaults[t],e))},addScalesToLayout:function(t){B.each(t.scales,(function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,pe.addBox(t,e)}))}},We=B.valueOrDefault,Ye=B.rtl.getRtlAdapter;Y._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:B.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:B.noop,beforeBody:B.noop,beforeLabel:B.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),B.isNullOrUndef(t.value)?n+=t.yLabel:n+=t.value,n},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:B.noop,afterBody:B.noop,beforeFooter:B.noop,footer:B.noop,afterFooter:B.noop}}});var ze={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:i/r,y:a/r}},nearest:function(t,e){var n,i,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var l=t[n];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=B.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Ee(t,e){return e&&(B.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ve(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function He(t){var e=Y.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:We(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:We(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:We(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:We(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:We(t.titleFontStyle,e.defaultFontStyle),titleFontSize:We(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:We(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:We(t.footerFontStyle,e.defaultFontStyle),footerFontSize:We(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Be(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function je(t){return Ee([],Ve(t))}var Ue=X.extend({initialize:function(){this._model=He(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Ee(o,Ve(i)),o=Ee(o,Ve(a)),o=Ee(o,Ve(r))},getBeforeBody:function(){return je(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return B.each(t,(function(t){var r={before:[],lines:[],after:[]};Ee(r.before,Ve(i.beforeLabel.call(n,t,e))),Ee(r.lines,i.label.call(n,t,e)),Ee(r.after,Ve(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return je(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Ee(r,Ve(n)),r=Ee(r,Ve(i)),r=Ee(r,Ve(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=He(c),m=h._active,p=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},y={width:f.width,height:f.height},x={x:f.caretX,y:f.caretY};if(m.length){g.opacity=1;var _=[],w=[];x=ze[c.position].call(h,m,h._eventPosition);var k=[];for(e=0,n=m.length;e<n;++e)k.push((i=m[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=i._xScale,r=i._yScale||i._scale,o=i._index,s=i._datasetIndex,l=i._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:i._model.x,y:i._model.y}));c.filter&&(k=k.filter((function(t){return c.filter(t,p)}))),c.itemSort&&(k=k.sort((function(t,e){return c.itemSort(t,e,p)}))),B.each(k,(function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))})),g.title=h.getTitle(k,p),g.beforeBody=h.getBeforeBody(k,p),g.body=h.getBody(k,p),g.afterBody=h.getAfterBody(k,p),g.footer=h.getFooter(k,p),g.x=x.x,g.y=x.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=w,g.dataPoints=k,y=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=B.fontString(u,e._titleFontStyle,e._titleFontFamily),B.each(e.title,f),n.font=B.fontString(d,e._bodyFontStyle,e._bodyFontFamily),B.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,B.each(r,(function(t){B.each(t.before,f),B.each(t.lines,f),B.each(t.after,f)})),c=0,n.font=B.fontString(h,e._footerFontStyle,e._footerFontFamily),B.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,g),b=function(t,e,n,i){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=n.xAlign,d=n.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>i.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,y,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,y),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=y.width,g.height=y.height,g.caretX=x.x,g.caretY=x.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+m)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+m-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=B.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r<s;++r)n.fillText(o[r],l.x(t.x),t.y+i/2),t.y+=i+a,r+1===s&&(t.y+=e.titleMarginBottom-a)}},drawBody:function(t,e,n){var i,a,r,o,s,l,u,d,h=e.bodyFontSize,c=e.bodySpacing,f=e._bodyAlign,g=e.body,m=e.displayColors,p=0,v=m?Be(e,"left"):0,b=Ye(e.rtl,e.x,e.width),y=function(e){n.fillText(e,b.x(t.x+p),t.y+h/2),t.y+=h+c},x=b.textAlign(f);for(n.textAlign=f,n.textBaseline="middle",n.font=B.fontString(h,e._bodyFontStyle,e._bodyFontFamily),t.x=Be(e,x),n.fillStyle=e.bodyFontColor,B.each(e.beforeBody,y),p=m&&"right"!==x?"center"===f?h/2+1:h+2:0,s=0,u=g.length;s<u;++s){for(i=g[s],a=e.labelTextColors[s],r=e.labelColors[s],n.fillStyle=a,B.each(i.before,y),l=0,d=(o=i.lines).length;l<d;++l){if(m){var _=b.x(v);n.fillStyle=e.legendColorBackground,n.fillRect(b.leftForLtr(_,h),t.y,h,h),n.lineWidth=1,n.strokeStyle=r.borderColor,n.strokeRect(b.leftForLtr(_,h),t.y,h,h),n.fillStyle=r.backgroundColor,n.fillRect(b.leftForLtr(b.xPlus(_,1),h-2),t.y+1,h-2,h-2),n.fillStyle=a}y(o[l])}B.each(i.after,y)}p=0,B.each(e.afterBody,y),t.y-=c},drawFooter:function(t,e,n){var i,a,r=e.footer,o=r.length;if(o){var s=Ye(e.rtl,e.x,e.width);for(t.x=Be(e,e._footerAlign),t.y+=e.footerMarginTop,n.textAlign=s.textAlign(e._footerAlign),n.textBaseline="middle",i=e.footerFontSize,n.fillStyle=e.footerFontColor,n.font=B.fontString(i,e._footerFontStyle,e._footerFontFamily),a=0;a<o;++a)n.fillText(r[a],s.x(t.x),t.y+i/2),t.y+=i+e.footerSpacing}},drawBackground:function(t,e,n,i){n.fillStyle=e.backgroundColor,n.strokeStyle=e.borderColor,n.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=i.width,u=i.height,d=e.cornerRadius;n.beginPath(),n.moveTo(o+d,s),"top"===r&&this.drawCaret(t,i),n.lineTo(o+l-d,s),n.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,i),n.lineTo(o+l,s+u-d),n.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,i),n.lineTo(o+d,s+u),n.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,i),n.lineTo(o,s+d),n.quadraticCurveTo(o,s,o+d,s),n.closePath(),n.fill(),e.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,B.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),B.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!B.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),Ge=ze,qe=Ue;qe.positioners=Ge;var Ze=B.valueOrDefault;function $e(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=n[t][a],r=Ze(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?B.merge(e[t][a],[Ne.getScaleDefaults(r),o]):B.merge(e[t][a],o)}else B._merger(t,e,n,i)}})}function Xe(){return B.merge(Object.create(null),[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||Object.create(null),r=n[t];"scales"===t?e[t]=$e(a,r):"scale"===t?e[t]=B.merge(a,[Ne.getScaleDefaults(r.type),r]):B._merger(t,e,n,i)}})}function Ke(t){var e=t.options;B.each(t.scales,(function(e){pe.removeBox(t,e)})),e=Xe(Y.global,Y[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Je(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(B.findIndex(t,a)>=0);return i}function Qe(t){return"top"===t||"bottom"===t}function tn(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}Y._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var en=function(t,e){return this.construct(t,e),this};B.extend(en.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||Object.create(null)).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(Y.global,Y[t.type],t.options||{}),t}(e);var i=Le.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=B.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,en.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Re.notify(t,"beforeInit"),B.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Re.notify(t,"afterInit"),t},clear:function(){return B.canvas.clear(this),this},stop:function(){return Q.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(B.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:B.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",B.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Re.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;B.each(e.xAxes,(function(t,n){t.id||(t.id=Je(e.xAxes,"x-axis-",n))})),B.each(e.yAxes,(function(t,n){t.id||(t.id=Je(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),B.each(i,(function(e){var i=e.options,r=i.id,o=Ze(i.type,e.dtype);Qe(i.position)!==Qe(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Ne.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),B.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Ne.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t<e;t++){var r=a[t],o=n.getDatasetMeta(t),s=r.type||n.config.type;if(o.type&&o.type!==s&&(n.destroyDatasetMeta(t),o=n.getDatasetMeta(t)),o.type=s,o.order=r.order||0,o.index=t,o.controller)o.controller.updateIndex(t),o.controller.linkScales();else{var l=Qt[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(n,t),i.push(o.controller)}}return i},resetElements:function(){var t=this;B.each(t.data.datasets,(function(e,n){t.getDatasetMeta(n).controller.reset()}),t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),Ke(i),Re._invalidate(i),!1!==Re.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();for(e=0,n=i.data.datasets.length;e<n;e++)i.getDatasetMeta(e).controller.buildOrUpdateElements();i.updateLayout(),i.options.animation&&i.options.animation.duration&&B.each(a,(function(t){t.reset()})),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],Re.notify(i,"afterUpdate"),i._layers.sort(tn("z","_idx")),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){var t=this;!1!==Re.notify(t,"beforeLayout")&&(pe.update(this,this.width,this.height),t._layers=[],B.each(t.boxes,(function(e){e._configure&&e._configure(),t._layers.push.apply(t._layers,e._layers())}),t),t._layers.forEach((function(t,e){t._idx=e})),Re.notify(t,"afterScaleUpdate"),Re.notify(t,"afterLayout"))},updateDatasets:function(){if(!1!==Re.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Re.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),n={meta:e,index:t};!1!==Re.notify(this,"beforeDatasetUpdate",[n])&&(e.controller._update(),Re.notify(this,"afterDatasetUpdate",[n]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var n=e.options.animation,i=Ze(t.duration,n&&n.duration),a=t.lazy;if(!1!==Re.notify(e,"beforeRender")){var r=function(t){Re.notify(e,"afterRender"),B.callback(n&&n.onComplete,[t],e)};if(n&&i){var o=new J({numSteps:i/16.66,easing:t.easing||n.easing,render:function(t,e){var n=B.easing.effects[e.easing],i=e.currentStep,a=i/e.numSteps;t.draw(n(a),a,i)},onAnimationProgress:n.onProgress,onAnimationComplete:r});Q.addAnimation(e,o,i,a)}else e.draw(),r(new J({numSteps:0,chart:e}));return e}},draw:function(t){var e,n,i=this;if(i.clear(),B.isNullOrUndef(t)&&(t=1),i.transition(t),!(i.width<=0||i.height<=0)&&!1!==Re.notify(i,"beforeDraw",[t])){for(n=i._layers,e=0;e<n.length&&n[e].z<=0;++e)n[e].draw(i.chartArea);for(i.drawDatasets(t);e<n.length;++e)n[e].draw(i.chartArea);i._drawTooltip(t),Re.notify(i,"afterDraw",[t])}},transition:function(t){for(var e=0,n=(this.data.datasets||[]).length;e<n;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},_getSortedDatasetMetas:function(t){var e,n,i=[];for(e=0,n=(this.data.datasets||[]).length;e<n;++e)t&&!this.isDatasetVisible(e)||i.push(this.getDatasetMeta(e));return i.sort(tn("order","index")),i},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(t){var e,n;if(!1!==Re.notify(this,"beforeDatasetsDraw",[t])){for(n=(e=this._getSortedVisibleDatasetMetas()).length-1;n>=0;--n)this.drawDataset(e[n],t);Re.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Re.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Re.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Re.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Re.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return oe.modes.single(this,t)},getElementsAtEvent:function(t){return oe.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return oe.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=oe.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return oe.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var t,e,n=this,i=n.canvas;for(n.stop(),t=0,e=n.data.datasets.length;t<e;++t)n.destroyDatasetMeta(t);i&&(n.unbindEvents(),B.canvas.clear(n),Le.releaseContext(n.ctx),n.canvas=null,n.ctx=null),Re.notify(n,"destroy"),delete en.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new qe({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};B.each(t.options.events,(function(i){Le.addEventListener(t,i,n),e[i]=n})),t.options.responsive&&(n=function(){t.resize()},Le.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,B.each(e,(function(e,n){Le.removeEventListener(t,n,e)})))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"set":"remove";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o+"HoverStyle"](i);"dataset"===e&&this.getDatasetMeta(t[0]._datasetIndex).controller["_"+o+"DatasetHoverStyle"]()},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==Re.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);n&&(i=n._start?n.handleEvent(t):i|n.handleEvent(t)),Re.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,n=this,i=n.options||{},a=i.hover;return n.lastActive=n.lastActive||[],"mouseout"===t.type?n.active=[]:n.active=n.getElementsAtEventForMode(t,a.mode,a),B.callback(i.onHover||i.hover.onHover,[t.native,n.active],n),"mouseup"!==t.type&&"click"!==t.type||i.onClick&&i.onClick.call(n,t.native,n.active),n.lastActive.length&&n.updateHoverStyle(n.lastActive,a.mode,!1),n.active.length&&a.mode&&n.updateHoverStyle(n.active,a.mode,!0),e=!B.arrayEquals(n.active,n.lastActive),n.lastActive=n.active,e}}),en.instances={};var nn=en;en.Controller=en,en.types={},B.configMerge=Xe,B.scaleMerge=$e;function an(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function rn(t){this.options=t||{}}B.extend(rn.prototype,{formats:an,parse:an,format:an,add:an,diff:an,startOf:an,endOf:an,_create:function(t){return t}}),rn.override=function(t){B.extend(rn.prototype,t)};var on={_date:rn},sn={formatters:{values:function(t){return B.isArray(t)?t:""+t},linear:function(t,e,n){var i=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=B.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=B.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(B.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},ln=B.isArray,un=B.isNullOrUndef,dn=B.valueOrDefault,hn=B.valueAtIndexOrDefault;function cn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=r<e?i:-i)<s-1e-6||o>l+1e-6)))return o}function fn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,m,p,v=n.length,b=[],y=[],x=[],_=0,w=0;for(a=0;a<v;++a){if(s=n[a].label,l=n[a].major?e.major:e.minor,t.font=u=l.string,d=i[u]=i[u]||{data:{},gc:[]},h=l.lineHeight,c=f=0,un(s)||ln(s)){if(ln(s))for(r=0,o=s.length;r<o;++r)g=s[r],un(g)||ln(g)||(c=B.measureText(t,d.data,d.gc,c,g),f+=h)}else c=B.measureText(t,d.data,d.gc,c,s),f=h;b.push(c),y.push(f),x.push(h/2),_=Math.max(c,_),w=Math.max(f,w)}function k(t){return{width:b[t]||0,height:y[t]||0,offset:x[t]||0}}return function(t,e){B.each(t,(function(t){var n,i=t.gc,a=i.length/2;if(a>e){for(n=0;n<a;++n)delete t.data[i[n]];i.splice(0,a)}}))}(i,v),m=b.indexOf(_),p=y.indexOf(w),{first:k(0),last:k(v-1),widest:k(m),highest:k(p)}}function gn(t){return t.drawTicks?t.tickMarkLength:0}function mn(t){var e,n;return t.display?(e=B.options._parseFont(t),n=B.options.toPadding(t.padding),e.lineHeight+n.height):0}function pn(t,e){return B.extend(B.options._parseFont({fontFamily:dn(e.fontFamily,t.fontFamily),fontSize:dn(e.fontSize,t.fontSize),fontStyle:dn(e.fontStyle,t.fontStyle),lineHeight:dn(e.lineHeight,t.lineHeight)}),{color:B.options.resolve([e.fontColor,t.fontColor,Y.global.defaultFontColor])})}function vn(t){var e=pn(t,t.minor);return{minor:e,major:t.major.enabled?pn(t,t.major):e}}function bn(t){var e,n,i,a=[];for(n=0,i=t.length;n<i;++n)void 0!==(e=t[n])._index&&a.push(e);return a}function yn(t,e,n,i){var a,r,o,s,l=dn(n,0),u=Math.min(dn(i,t.length),t.length),d=0;for(e=Math.ceil(e),i&&(e=(a=i-n)/Math.floor(a/e)),s=l;s<0;)d++,s=Math.round(l+d*e);for(r=Math.max(l,0);r<u;r++)o=t[r],r===s?(o._index=r,d++,s=Math.round(l+d*e)):delete o.label}Y._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:sn.formatters.values,minor:{},major:{}}});var xn=X.extend({zeroLineIndex:0,getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){B.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,s,l=this,u=l.options.ticks,d=u.sampleSize;if(l.beforeUpdate(),l.maxWidth=t,l.maxHeight=e,l.margins=B.extend({left:0,right:0,top:0,bottom:0},n),l._ticks=null,l.ticks=null,l._labelSizes=null,l._maxLabelLines=0,l.longestLabelWidth=0,l.longestTextCache=l.longestTextCache||{},l._gridLineItems=null,l._labelItems=null,l.beforeSetDimensions(),l.setDimensions(),l.afterSetDimensions(),l.beforeDataLimits(),l.determineDataLimits(),l.afterDataLimits(),l.beforeBuildTicks(),o=l.buildTicks()||[],(!(o=l.afterBuildTicks(o)||o)||!o.length)&&l.ticks)for(o=[],i=0,a=l.ticks.length;i<a;++i)o.push({value:l.ticks[i],major:!1});return l._ticks=o,s=d<o.length,r=l._convertTicksToLabels(s?function(t,e){for(var n=[],i=t.length/e,a=0,r=t.length;a<r;a+=i)n.push(t[Math.floor(a)]);return n}(o,d):o),l._configure(),l.beforeCalculateTickRotation(),l.calculateTickRotation(),l.afterCalculateTickRotation(),l.beforeFit(),l.fit(),l.afterFit(),l._ticksToDraw=u.display&&(u.autoSkip||"auto"===u.source)?l._autoSkip(o):o,s&&(r=l._convertTicksToLabels(l._ticksToDraw)),l.ticks=r,l.afterUpdate(),l.minSize},_configure:function(){var t,e,n=this,i=n.options.ticks.reverse;n.isHorizontal()?(t=n.left,e=n.right):(t=n.top,e=n.bottom,i=!i),n._startPixel=t,n._endPixel=e,n._reversePixels=i,n._length=e-t},afterUpdate:function(){B.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){B.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){B.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){B.callback(this.options.beforeDataLimits,[this])},determineDataLimits:B.noop,afterDataLimits:function(){B.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){B.callback(this.options.beforeBuildTicks,[this])},buildTicks:B.noop,afterBuildTicks:function(t){var e=this;return ln(t)&&t.length?B.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=B.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){B.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){B.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){B.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t,e,n,i,a,r,o,s=this,l=s.options,u=l.ticks,d=s.getTicks().length,h=u.minRotation||0,c=u.maxRotation,f=h;!s._isVisible()||!u.display||h>=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-gn(l.gridLines)-u.padding-mn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=B.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=gn(o)+mn(r)),u?s&&(e.height=gn(o)+mn(r)):e.height=t.maxHeight,a.display&&s){var d=vn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,m=h.highest,p=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,y=B.toRadians(t.labelRotation),x=Math.cos(y),_=Math.sin(y),w=_*g.width+x*(m.height-(b?m.offset:0))+(b?0:p);e.height=Math.min(t.maxHeight,e.height+w+v);var k,M,S=t.getPixelForTick(0)-t.left,D=t.right-t.getPixelForTick(t.getTicks().length-1);b?(k=l?x*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):x*f.width+_*f.offset):(k=c.width/2,M=f.width/2),t.paddingLeft=Math.max((k-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-D)*t.width/(t.width-D),0)+3}else{var C=a.mirror?0:g.width+v+p;e.width=Math.min(t.maxWidth,e.width+C),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(un(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;n<i;++n)t[n].label=e[n];return e},_getLabelSizes:function(){var t=this,e=t._labelSizes;return e||(t._labelSizes=e=fn(t.ctx,vn(t.options.ticks),t.getTicks(),t.longestTextCache),t.longestLabelWidth=e.widest.width),e},_parseValue:function(t){var e,n,i,a;return ln(t)?(e=+this.getRightValue(t[0]),n=+this.getRightValue(t[1]),i=Math.min(e,n),a=Math.max(e,n)):(e=void 0,n=t=+this.getRightValue(t),i=t,a=t),{min:i,max:a,start:e,end:n}},_getScaleLabel:function(t){var e=this._parseValue(t);return void 0!==e.start?"["+e.start+", "+e.end+"]":+this.getRightValue(t)},getLabelForIndex:B.noop,getPixelForValue:B.noop,getValueForPixel:B.noop,getPixelForTick:function(t){var e=this.options.offset,n=this._ticks.length,i=1/Math.max(n-(e?0:1),1);return t<0||t>n-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;e<n;e++)t[e].major&&i.push(e);return i}(t):[],u=l.length,d=l[0],h=l[u-1];if(u>s)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;i<t.length;i++)a=t[i],i===o?(a._index=i,o=e[++r*n]):delete a.label}(t,l,u/s),bn(t);if(i=function(t,e,n,i){var a,r,o,s,l=function(t){var e,n,i=t.length;if(i<2)return!1;for(n=t[0],e=1;e<i;++e)if(t[e]-t[e-1]!==n)return!1;return n}(t),u=(e.length-1)/i;if(!l)return Math.max(u,1);for(o=0,s=(a=B.math._factorize(l)).length-1;o<s;o++)if((r=a[o])>u)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e<n;e++)yn(t,i,l[e],l[e+1]);return a=u>1?(h-d)/(u-1):null,yn(t,i,B.isNullOrUndef(a)?0:d-a,d),yn(t,i,h,B.isNullOrUndef(a)?t.length:h+a),bn(t)}return yn(t,i),bn(t)},_tickSize:function(){var t=this.options.ticks,e=B.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i<o*n?s/n:o/i},_isVisible:function(){var t,e,n,i=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=i.data.datasets.length;t<e;++t)if(i.isDatasetVisible(t)&&((n=i.getDatasetMeta(t)).xAxisID===this.id||n.yAxisID===this.id))return!0;return!1},_computeGridLineItems:function(t){var e,n,i,a,r,o,s,l,u,d,h,c,f,g,m,p,v,b=this,y=b.chart,x=b.options,_=x.gridLines,w=x.position,k=_.offsetGridLines,M=b.isHorizontal(),S=b._ticksToDraw,D=S.length+(k?1:0),C=gn(_),P=[],T=_.drawBorder?hn(_.lineWidth,0,0):0,O=T/2,A=B._alignPixel,F=function(t){return A(y,t,T)};for("top"===w?(e=F(b.bottom),s=b.bottom-C,u=e-O,h=F(t.top)+O,f=t.bottom):"bottom"===w?(e=F(b.top),h=t.top,f=F(t.bottom)-O,s=e+O,u=b.top+C):"left"===w?(e=F(b.right),o=b.right-C,l=e-O,d=F(t.left)+O,c=t.right):(e=F(b.left),d=t.left,c=F(t.right)-O,o=e+O,l=b.left+C),n=0;n<D;++n)i=S[n]||{},un(i.label)&&n<S.length||(n===b.zeroLineIndex&&x.offset===k?(g=_.zeroLineWidth,m=_.zeroLineColor,p=_.zeroLineBorderDash||[],v=_.zeroLineBorderDashOffset||0):(g=hn(_.lineWidth,n,1),m=hn(_.color,n,"rgba(0,0,0,0.1)"),p=_.borderDash||[],v=_.borderDashOffset||0),void 0!==(a=cn(b,i._index||n,k))&&(r=A(y,a,g),M?o=l=d=c=r:s=u=h=f=r,P.push({tx1:o,ty1:s,tx2:l,ty2:u,x1:d,y1:h,x2:c,y2:f,width:g,color:m,borderDash:p,borderDashOffset:v})));return P.ticksLength=D,P.borderValue=e,P},_computeLabelItems:function(){var t,e,n,i,a,r,o,s,l,u,d,h,c=this,f=c.options,g=f.ticks,m=f.position,p=g.mirror,v=c.isHorizontal(),b=c._ticksToDraw,y=vn(g),x=g.padding,_=gn(f.gridLines),w=-B.toRadians(c.labelRotation),k=[];for("top"===m?(r=c.bottom-_-x,o=w?"left":"center"):"bottom"===m?(r=c.top+_+x,o=w?"right":"center"):"left"===m?(a=c.right-(p?0:_)-x,o=p?"left":"right"):(a=c.left+(p?0:_)+x,o=p?"right":"left"),t=0,e=b.length;t<e;++t)i=(n=b[t]).label,un(i)||(s=c.getPixelForTick(n._index||t)+g.labelOffset,u=(l=n.major?y.major:y.minor).lineHeight,d=ln(i)?i.length:1,v?(a=s,h="top"===m?((w?1:.5)-d)*u:(w?0:.5)*u):(r=s,h=(1-d)*u/2),k.push({x:a,y:r,rotation:w,label:i,font:l,textOffset:h,textAlign:o}));return k},_drawGrid:function(t){var e=this,n=e.options.gridLines;if(n.display){var i,a,r,o,s,l=e.ctx,u=e.chart,d=B._alignPixel,h=n.drawBorder?hn(n.lineWidth,0,0):0,c=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));for(r=0,o=c.length;r<o;++r)i=(s=c[r]).width,a=s.color,i&&a&&(l.save(),l.lineWidth=i,l.strokeStyle=a,l.setLineDash&&(l.setLineDash(s.borderDash),l.lineDashOffset=s.borderDashOffset),l.beginPath(),n.drawTicks&&(l.moveTo(s.tx1,s.ty1),l.lineTo(s.tx2,s.ty2)),n.drawOnChartArea&&(l.moveTo(s.x1,s.y1),l.lineTo(s.x2,s.y2)),l.stroke(),l.restore());if(h){var f,g,m,p,v=h,b=hn(n.lineWidth,c.ticksLength-1,1),y=c.borderValue;e.isHorizontal()?(f=d(u,e.left,v)-v/2,g=d(u,e.right,b)+b/2,m=p=y):(m=d(u,e.top,v)-v/2,p=d(u,e.bottom,b)+b/2,f=g=y),l.lineWidth=h,l.strokeStyle=hn(n.color,0),l.beginPath(),l.moveTo(f,m),l.lineTo(g,p),l.stroke()}}},_drawLabels:function(){var t=this;if(t.options.ticks.display){var e,n,i,a,r,o,s,l,u=t.ctx,d=t._labelItems||(t._labelItems=t._computeLabelItems());for(e=0,i=d.length;e<i;++e){if(o=(r=d[e]).font,u.save(),u.translate(r.x,r.y),u.rotate(r.rotation),u.font=o.string,u.fillStyle=o.color,u.textBaseline="middle",u.textAlign=r.textAlign,s=r.label,l=r.textOffset,ln(s))for(n=0,a=s.length;n<a;++n)u.fillText(""+s[n],0,l),l+=o.lineHeight;else u.fillText(s,0,l);u.restore()}}},_drawTitle:function(){var t=this,e=t.ctx,n=t.options,i=n.scaleLabel;if(i.display){var a,r,o=dn(i.fontColor,Y.global.defaultFontColor),s=B.options._parseFont(i),l=B.options.toPadding(i.padding),u=s.lineHeight/2,d=n.position,h=0;if(t.isHorizontal())a=t.left+t.width/2,r="bottom"===d?t.bottom-u-l.bottom:t.top+u+l.top;else{var c="left"===d;a=c?t.left+u+l.top:t.right-u-l.top,r=t.top+t.height/2,h=c?-.5*Math.PI:.5*Math.PI}e.save(),e.translate(a,r),e.rotate(h),e.textAlign="center",e.textBaseline="middle",e.fillStyle=o,e.font=s.string,e.fillText(i.labelString,0,0),e.restore()}},draw:function(t){this._isVisible()&&(this._drawGrid(t),this._drawTitle(),this._drawLabels())},_layers:function(){var t=this,e=t.options,n=e.ticks&&e.ticks.z||0,i=e.gridLines&&e.gridLines.z||0;return t._isVisible()&&n!==i&&t.draw===t._draw?[{z:i,draw:function(){t._drawGrid.apply(t,arguments),t._drawTitle.apply(t,arguments)}},{z:n,draw:function(){t._drawLabels.apply(t,arguments)}}]:[{z:n,draw:function(){t.draw.apply(t,arguments)}}]},_getMatchingVisibleMetas:function(t){var e=this,n=e.isHorizontal();return e.chart._getSortedVisibleDatasetMetas().filter((function(i){return(!t||i.type===t)&&(n?i.xAxisID===e.id:i.yAxisID===e.id)}))}});xn.prototype._draw=xn.prototype.draw;var _n=xn,wn=B.isNullOrUndef,kn=_n.extend({determineDataLimits:function(){var t,e=this,n=e._getLabels(),i=e.options.ticks,a=i.min,r=i.max,o=0,s=n.length-1;void 0!==a&&(t=n.indexOf(a))>=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;_n.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return wn(e)||wn(n)||(t=o.chart.data.datasets[n].data[e]),wn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=B.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),Mn={position:"bottom"};kn._defaults=Mn;var Sn=B.noop,Dn=B.isNullOrUndef;var Cn=_n.extend({getRightValue:function(t){return"string"==typeof t?+t:_n.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=B.sign(t.min),i=B.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:Sn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:B.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,m=B.niceNum((g-f)/u/l)*l;if(m<1e-14&&Dn(d)&&Dn(h))return[f,g];(r=Math.ceil(g/m)-Math.floor(f/m))>u&&(m=B.niceNum(r*m/u/l)*l),s||Dn(c)?n=Math.pow(10,B._decimalPlaces(m)):(n=Math.pow(10,c),m=Math.ceil(m*n)/n),i=Math.floor(f/m)*m,a=Math.ceil(g/m)*m,s&&(!Dn(d)&&B.almostWhole(d/m,m/1e3)&&(i=d),!Dn(h)&&B.almostWhole(h/m,m/1e3)&&(a=h)),r=(a-i)/m,r=B.almostEquals(r,Math.round(r),m/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Dn(d)?i:d);for(var p=1;p<r;++p)o.push(Math.round((i+p*m)*n)/n);return o.push(Dn(h)?a:h),o}(i,t);t.handleDirectionalChanges(),t.max=B.max(a),t.min=B.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),_n.prototype.convertTicksToLabels.call(t)},_configure:function(){var t,e=this,n=e.getTicks(),i=e.min,a=e.max;_n.prototype._configure.call(e),e.options.offset&&n.length&&(i-=t=(a-i)/Math.max(n.length-1,1)/2,a+=t),e._startValue=i,e._endValue=a,e._valueRange=a-i}}),Pn={position:"left",ticks:{callback:sn.formatters.linear}};function Tn(t,e,n,i){var a,r,o=t.options,s=function(t,e,n){var i=[n.type,void 0===e&&void 0===n.stack?n.index:"",n.stack].join(".");return void 0===t[i]&&(t[i]={pos:[],neg:[]}),t[i]}(e,o.stacked,n),l=s.pos,u=s.neg,d=i.length;for(a=0;a<d;++a)r=t._parseValue(i[a]),isNaN(r.min)||isNaN(r.max)||n.data[a].hidden||(l[a]=l[a]||0,u[a]=u[a]||0,o.relativePoints?l[a]=100:r.min<0||r.max<0?u[a]+=r.min:l[a]+=r.max)}function On(t,e,n){var i,a,r=n.length;for(i=0;i<r;++i)a=t._parseValue(n[i]),isNaN(a.min)||isNaN(a.max)||e.data[i].hidden||(t.min=Math.min(t.min,a.min),t.max=Math.max(t.max,a.max))}var An=Cn.extend({determineDataLimits:function(){var t,e,n,i,a=this,r=a.options,o=a.chart.data.datasets,s=a._getMatchingVisibleMetas(),l=r.stacked,u={},d=s.length;if(a.min=Number.POSITIVE_INFINITY,a.max=Number.NEGATIVE_INFINITY,void 0===l)for(t=0;!l&&t<d;++t)l=void 0!==(e=s[t]).stack;for(t=0;t<d;++t)n=o[(e=s[t]).index].data,l?Tn(a,u,e,n):On(a,e,n);B.each(u,(function(t){i=t.pos.concat(t.neg),a.min=Math.min(a.min,B.min(i)),a.max=Math.max(a.max,B.max(i))})),a.min=B.isFinite(a.min)&&!isNaN(a.min)?a.min:0,a.max=B.isFinite(a.max)&&!isNaN(a.max)?a.max:1,a.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=B.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){return this.getPixelForDecimal((+this.getRightValue(t)-this._startValue)/this._valueRange)},getValueForPixel:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange},getPixelForTick:function(t){var e=this.ticksAsNumbers;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])}}),Fn=Pn;An._defaults=Fn;var In=B.valueOrDefault,Ln=B.math.log10;var Rn={position:"left",ticks:{callback:sn.formatters.logarithmic}};function Nn(t,e){return B.isFinite(t)&&t>=0?t:e}var Wn=_n.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e)&&void 0!==e.stack){c=!0;break}if(s.stacked||c){var f={};for(t=0;t<u.length;t++){var g=[(e=l.getDatasetMeta(t)).type,void 0===s.stacked&&void 0===e.stack?t:"",e.stack].join(".");if(l.isDatasetVisible(t)&&h(e))for(void 0===f[g]&&(f[g]=[]),a=0,r=(i=u[t].data).length;a<r;a++){var m=f[g];n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(m[a]=m[a]||0,m[a]+=n.max)}}B.each(f,(function(t){if(t.length>0){var e=B.min(t),n=B.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e))for(a=0,r=(i=u[t].data).length;a<r;a++)n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(o.min=Math.min(n.min,o.min),o.max=Math.max(n.max,o.max),0!==n.min&&(o.minNotZero=Math.min(n.min,o.minNotZero)));o.min=B.isFinite(o.min)?o.min:null,o.max=B.isFinite(o.max)?o.max:null,o.minNotZero=B.isFinite(o.minNotZero)?o.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=Nn(e.min,t.min),t.max=Nn(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(Ln(t.min))-1),t.max=Math.pow(10,Math.floor(Ln(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(Ln(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(Ln(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Ln(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:Nn(e.min),max:Nn(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Ln(e.min)))),o=Math.floor(Ln(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Ln(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Ln(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(n<o||n===o&&i<s);var u=In(t.max,r);return a.push(u),a}(i,t);t.max=B.max(a),t.min=B.min(a),e.reverse?(n=!n,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),n&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),_n.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){var e=this.tickValues;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Ln(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;_n.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,Y.global.defaultFontSize)/t._length),t._startValue=Ln(e),t._valueOffset=n,t._valueRange=(Ln(t.max)-Ln(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Ln(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),Yn=Rn;Wn._defaults=Yn;var zn=B.valueOrDefault,En=B.valueAtIndexOrDefault,Vn=B.options.resolve,Hn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:sn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Bn(t){var e=t.ticks;return e.display&&t.display?zn(e.fontSize,Y.global.defaultFontSize)+2*e.backdropPaddingY:0}function jn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n,end:e}:{start:e,end:e+n}}function Un(t){return 0===t||180===t?"center":t<180?"left":"right"}function Gn(t,e,n,i){var a,r,o=n.y+i/2;if(B.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],n.x,o),o+=i;else t.fillText(e,n.x,o)}function qn(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function Zn(t){return B.isNumber(t)?t:0}var $n=Cn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Bn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;B.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);B.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Bn(this.options))},convertTicksToLabels:function(){var t=this;Cn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=B.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=B.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;e<d;e++){i=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e],n=B.isArray(u)?{w:B.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=n;var h=t.getIndexAngle(e),c=B.toDegrees(h)%360,f=jn(c,i.x,n.w,0,180),g=jn(c,i.y,n.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Zn(a),r=Zn(r),o=Zn(o),s=Zn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(B.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=zn(s.lineWidth,o.lineWidth),u=zn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Bn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=B.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=En(i.fontColor,s,Y.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=B.toDegrees(h);e.textAlign=Un(c),qn(c,t._pointLabelSizes[s],u),Gn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&B.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=En(e.color,i-1),u=En(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,n),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(i,o,e,n))})),s.display&&l&&u){for(a.save(),a.lineWidth=l,a.strokeStyle=u,a.setLineDash&&(a.setLineDash(Vn([s.borderDash,o.borderDash,[]])),a.lineDashOffset=Vn([s.borderDashOffset,o.borderDashOffset,0])),t=i.chart.data.labels.length-1;t>=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=B.options._parseFont(n),s=zn(n.fontColor,Y.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",B.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:B.noop}),Xn=Hn;$n._defaults=Xn;var Kn=B._deprecated,Jn=B.options.resolve,Qn=B.valueOrDefault,ti=Number.MIN_SAFE_INTEGER||-9007199254740991,ei=Number.MAX_SAFE_INTEGER||9007199254740991,ni={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ii=Object.keys(ni);function ai(t,e){return t-e}function ri(t){return B.valueOrDefault(t.time.min,t.ticks.min)}function oi(t){return B.valueOrDefault(t.time.max,t.ticks.max)}function si(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function li(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),B.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),B.isFinite(o)||(o=n.parse(o))),o)}function ui(t,e){if(B.isNullOrUndef(e))return null;var n=t.options.time,i=li(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function di(t,e,n,i){var a,r,o,s=ii.length;for(a=ii.indexOf(t);a<s-1;++a)if(o=(r=ni[ii[a]]).steps?r.steps:ei,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return ii[a];return ii[s-1]}function hi(t,e,n){var i,a,r=[],o={},s=e.length;for(i=0;i<s;++i)o[a=e[i]]=i,r.push({value:a,major:!1});return 0!==s&&n?function(t,e,n,i){var a,r,o=t._adapter,s=+o.startOf(e[0].value,i),l=e[e.length-1].value;for(a=s;a<=l;a=+o.add(a,1,i))(r=n[a])>=0&&(e[r].major=!0);return e}(t,r,o,n):r}var ci=_n.extend({initialize:function(){this.mergeTicksOptions(),_n.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new on._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),B.mergeIf(n.displayFormats,i.formats()),_n.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),_n.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=ei,f=ti,g=[],m=[],p=[],v=s._getLabels();for(t=0,n=v.length;t<n;++t)p.push(ui(s,v[t]));for(t=0,n=(l.data.datasets||[]).length;t<n;++t)if(l.isDatasetVisible(t))if(a=l.data.datasets[t].data,B.isObject(a[0]))for(m[t]=[],e=0,i=a.length;e<i;++e)r=ui(s,a[e]),g.push(r),m[t][e]=r;else m[t]=p.slice(0),o||(g=g.concat(p),o=!0);else m[t]=[];p.length&&(c=Math.min(c,p[0]),f=Math.max(f,p[p.length-1])),g.length&&(g=n>1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}(g).sort(ai):g.sort(ai),c=Math.min(c,g[0]),f=Math.max(f,g[g.length-1])),c=ui(s,ri(d))||c,f=ui(s,oi(d))||f,c=c===ei?+u.startOf(Date.now(),h):c,f=f===ti?+u.endOf(Date.now(),h)+1:f,s.min=Math.min(c,f),s.max=Math.max(c+1,f),s._table=[],s._timestamps={data:g,datasets:m,labels:p}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,o=i.options,s=o.ticks,l=o.time,u=i._timestamps,d=[],h=i.getLabelCapacity(a),c=s.source,f=o.distribution;for(u="data"===c||"auto"===c&&"series"===f?u.data:"labels"===c?u.labels:function(t,e,n,i){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||di(s.minUnit,e,n,i),u=Jn([s.stepSize,s.unitStepSize,1]),d="week"===l&&s.isoWeekday,h=e,c=[];if(d&&(h=+r.startOf(h,"isoWeek",d)),h=+r.startOf(h,d?"day":l),r.diff(n,e,l)>1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a<n;a=+r.add(a,u,l))c.push(a);return a!==n&&"ticks"!==o.bounds||c.push(a),c}(i,a,r,h),"ticks"===o.bounds&&u.length&&(a=u[0],r=u[u.length-1]),a=ui(i,ri(o))||a,r=ui(i,oi(o))||r,t=0,e=u.length;t<e;++t)(n=u[t])>=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?di(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ii.length-1;r>=ii.indexOf(n);r--)if(o=ii[r],ni[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ii[n?ii.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ii.indexOf(t)+1,n=ii.length;e<n;++e)if(ni[ii[e]].common)return ii[e]}(i._unit):void 0,i._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(i._timestamps.data,a,r,f),i._offsets=function(t,e,n,i,a){var r,o,s=0,l=0;return a.offset&&e.length&&(r=si(t,"time",e[0],"pos"),s=1===e.length?1-r:(si(t,"time",e[1],"pos")-r)/2,o=si(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-si(t,"time",e[e.length-2],"pos"))/2),{start:s,end:l,factor:1/(s+1+l)}}(i._table,d,0,0,o),s.reverse&&d.reverse(),hi(i,d,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n._adapter,a=n.chart.data,r=n.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return B.isObject(s)&&(o=n.getRightValue(s)),r.tooltipFormat?i.format(li(n,o),r.tooltipFormat):"string"==typeof o?o:i.format(li(n,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,n,i){var a=this._adapter,r=this.options,o=r.time.displayFormats,s=o[this._unit],l=this._majorUnit,u=o[l],d=n[e],h=r.ticks,c=l&&u&&d&&d.major,f=a.format(t,i||(c?u:s)),g=c?h.major:h.minor,m=Jn([g.callback,g.userCallback,h.callback,h.userCallback]);return m?m(f,e,n):f},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(t[e].value,e,t));return i},getPixelForOffset:function(t){var e=this._offsets,n=si(this._table,"time",t,"pos");return this.getPixelForDecimal((e.start+n)*e.factor)},getPixelForValue:function(t,e,n){var i=null;if(void 0!==e&&void 0!==n&&(i=this._timestamps.datasets[n][e]),null===i&&(i=ui(this,t)),null!==i)return this.getPixelForOffset(i)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this._offsets,n=this.getDecimalForPixel(t)/e.factor-e.end,i=si(this._table,"pos",n,"time");return this._adapter._create(i)},_getLabelSize:function(t){var e=this.options.ticks,n=this.ctx.measureText(t).width,i=B.toRadians(this.isHorizontal()?e.maxRotation:e.minRotation),a=Math.cos(i),r=Math.sin(i),o=Qn(e.fontSize,Y.global.defaultFontSize);return{w:n*a+o*r,h:n*r+o*a}},getLabelWidth:function(t){return this._getLabelSize(t).w},getLabelCapacity:function(t){var e=this,n=e.options.time,i=n.displayFormats,a=i[n.unit]||i.millisecond,r=e.tickFormatFunction(t,0,hi(e,[t],e._majorUnit),a),o=e._getLabelSize(r),s=Math.floor(e.isHorizontal()?e.width/o.w:e.height/o.h);return e.options.offset&&s--,s>0?s:1}}),fi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};ci._defaults=fi;var gi={category:kn,linear:An,logarithmic:Wn,radialLinear:$n,time:ci},mi=e((function(e,n){e.exports=function(){var n,i;function a(){return n.apply(null,arguments)}function r(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function d(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function h(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var n in e)h(e,n)&&(t[n]=e[n]);return h(e,"toString")&&(t.toString=e.toString),h(e,"valueOf")&&(t.valueOf=e.valueOf),t}function f(t,e,n,i){return Ie(t,e,n,i,!0).utc()}function g(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function m(t){if(null==t._isValid){var e=g(t),n=i.call(e.parsedDateParts,(function(t){return null!=t})),a=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n);if(t._strict&&(a=a&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return a;t._isValid=a}return t._isValid}function p(t){var e=f(NaN);return null!=t?c(g(e),t):g(e).userInvalidated=!0,e}i=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i<n;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1};var v=a.momentProperties=[];function b(t,e){var n,i,a;if(s(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),s(e._i)||(t._i=e._i),s(e._f)||(t._f=e._f),s(e._l)||(t._l=e._l),s(e._strict)||(t._strict=e._strict),s(e._tzm)||(t._tzm=e._tzm),s(e._isUTC)||(t._isUTC=e._isUTC),s(e._offset)||(t._offset=e._offset),s(e._pf)||(t._pf=g(e)),s(e._locale)||(t._locale=e._locale),v.length>0)for(n=0;n<v.length;n++)s(a=e[i=v[n]])||(t[i]=a);return t}var y=!1;function x(t){b(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===y&&(y=!0,a.updateOffset(this),y=!1)}function _(t){return t instanceof x||null!=t&&null!=t._isAMomentObject}function w(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function k(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=w(e)),n}function M(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i<a;i++)(n&&t[i]!==e[i]||!n&&k(t[i])!==k(e[i]))&&o++;return o+r}function S(t){!1===a.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function D(t,e){var n=!0;return c((function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,t),n){for(var i,r=[],o=0;o<arguments.length;o++){if(i="","object"==typeof arguments[o]){for(var s in i+="\n["+o+"] ",arguments[0])i+=s+": "+arguments[0][s]+", ";i=i.slice(0,-2)}else i=arguments[o];r.push(i)}S(t+"\nArguments: "+Array.prototype.slice.call(r).join("")+"\n"+(new Error).stack),n=!1}return e.apply(this,arguments)}),e)}var C,P={};function T(t,e){null!=a.deprecationHandler&&a.deprecationHandler(t,e),P[t]||(S(e),P[t]=!0)}function O(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function A(t,e){var n,i=c({},t);for(n in e)h(e,n)&&(o(t[n])&&o(e[n])?(i[n]={},c(i[n],t[n]),c(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);for(n in t)h(t,n)&&!h(e,n)&&o(t[n])&&(i[n]=c({},i[n]));return i}function F(t){null!=t&&this.set(t)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,C=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)h(t,e)&&n.push(e);return n};var I={};function L(t,e){var n=t.toLowerCase();I[n]=I[n+"s"]=I[e]=t}function R(t){return"string"==typeof t?I[t]||I[t.toLowerCase()]:void 0}function N(t){var e,n,i={};for(n in t)h(t,n)&&(e=R(n))&&(i[e]=t[n]);return i}var W={};function Y(t,e){W[t]=e}function z(t,e,n){var i=""+Math.abs(t),a=e-i.length;return(t>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}var E=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,H={},B={};function j(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(B[t]=a),e&&(B[e[0]]=function(){return z(a.apply(this,arguments),e[1],e[2])}),n&&(B[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),H[e]=H[e]||function(t){var e,n,i,a=t.match(E);for(e=0,n=a.length;e<n;e++)B[a[e]]?a[e]=B[a[e]]:a[e]=(i=a[e]).match(/\[[\s\S]/)?i.replace(/^\[|\]$/g,""):i.replace(/\\/g,"");return function(e){var i,r="";for(i=0;i<n;i++)r+=O(a[i])?a[i].call(e,t):a[i];return r}}(e),H[e](t)):t.localeData().invalidDate()}function G(t,e){var n=5;function i(t){return e.longDateFormat(t)||t}for(V.lastIndex=0;n>=0&&V.test(t);)t=t.replace(V,i),V.lastIndex=0,n-=1;return t}var q=/\d/,Z=/\d\d/,$=/\d{3}/,X=/\d{4}/,K=/[+-]?\d{6}/,J=/\d\d?/,Q=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,it=/[+-]?\d{1,6}/,at=/\d+/,rt=/[+-]?\d+/,ot=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function dt(t,e,n){ut[t]=O(e)?e:function(t,i){return t&&n?n:e}}function ht(t,e){return h(ut,t)?ut[t](e._strict,e._locale):new RegExp(ct(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,n,i,a){return e||n||i||a}))))}function ct(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var ft={};function gt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n<t.length;n++)ft[t[n]]=i}function mt(t,e){gt(t,(function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)}))}function pt(t,e,n){null!=e&&h(ft,t)&&ft[t](e,n._a,n,t)}var vt=0,bt=1,yt=2,xt=3,_t=4,wt=5,kt=6,Mt=7,St=8;function Dt(t){return Ct(t)?366:365}function Ct(t){return t%4==0&&t%100!=0||t%400==0}j("Y",0,0,(function(){var t=this.year();return t<=9999?""+t:"+"+t})),j(0,["YY",2],0,(function(){return this.year()%100})),j(0,["YYYY",4],0,"year"),j(0,["YYYYY",5],0,"year"),j(0,["YYYYYY",6,!0],0,"year"),L("year","y"),Y("year",1),dt("Y",rt),dt("YY",J,Z),dt("YYYY",nt,X),dt("YYYYY",it,K),dt("YYYYYY",it,K),gt(["YYYYY","YYYYYY"],vt),gt("YYYY",(function(t,e){e[vt]=2===t.length?a.parseTwoDigitYear(t):k(t)})),gt("YY",(function(t,e){e[vt]=a.parseTwoDigitYear(t)})),gt("Y",(function(t,e){e[vt]=parseInt(t,10)})),a.parseTwoDigitYear=function(t){return k(t)+(k(t)>68?1900:2e3)};var Pt,Tt=Ot("FullYear",!0);function Ot(t,e){return function(n){return null!=n?(Ft(this,t,n),a.updateOffset(this,e),this):At(this,t)}}function At(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Ft(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&Ct(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),It(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function It(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=function(t,e){return(t%e+e)%e}(e,12);return t+=(e-n)/12,1===n?Ct(t)?29:28:31-n%7%2}Pt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},j("M",["MM",2],"Mo",(function(){return this.month()+1})),j("MMM",0,0,(function(t){return this.localeData().monthsShort(this,t)})),j("MMMM",0,0,(function(t){return this.localeData().months(this,t)})),L("month","M"),Y("month",8),dt("M",J),dt("MM",J,Z),dt("MMM",(function(t,e){return e.monthsShortRegex(t)})),dt("MMMM",(function(t,e){return e.monthsRegex(t)})),gt(["M","MM"],(function(t,e){e[bt]=k(t)-1})),gt(["MMM","MMMM"],(function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[bt]=a:g(n).invalidMonth=t}));var Lt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Rt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Nt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Wt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)r=f([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(a=Pt.call(this._shortMonthsParse,o))?a:null:-1!==(a=Pt.call(this._longMonthsParse,o))?a:null:"MMM"===e?-1!==(a=Pt.call(this._shortMonthsParse,o))?a:-1!==(a=Pt.call(this._longMonthsParse,o))?a:null:-1!==(a=Pt.call(this._longMonthsParse,o))?a:-1!==(a=Pt.call(this._shortMonthsParse,o))?a:null}function Yt(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=k(e);else if(!l(e=t.localeData().monthsParse(e)))return t;return n=Math.min(t.date(),It(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function zt(t){return null!=t?(Yt(this,t),a.updateOffset(this,!0),this):At(this,"Month")}var Et=lt,Vt=lt;function Ht(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;e<12;e++)n=f([2e3,e]),i.push(this.monthsShort(n,"")),a.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(i.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)i[e]=ct(i[e]),a[e]=ct(a[e]);for(e=0;e<24;e++)r[e]=ct(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")","i")}function Bt(t,e,n,i,a,r,o){var s;return t<100&&t>=0?(s=new Date(t+400,e,n,i,a,r,o),isFinite(s.getFullYear())&&s.setFullYear(t)):s=new Date(t,e,n,i,a,r,o),s}function jt(t){var e;if(t<100&&t>=0){var n=Array.prototype.slice.call(arguments);n[0]=t+400,e=new Date(Date.UTC.apply(null,n)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function Ut(t,e,n){var i=7+e-n;return-(7+jt(t,0,i).getUTCDay()-e)%7+i-1}function Gt(t,e,n,i,a){var r,o,s=1+7*(e-1)+(7+n-i)%7+Ut(t,i,a);return s<=0?o=Dt(r=t-1)+s:s>Dt(t)?(r=t+1,o=s-Dt(t)):(r=t,o=s),{year:r,dayOfYear:o}}function qt(t,e,n){var i,a,r=Ut(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Zt(a=t.year()-1,e,n):o>Zt(t.year(),e,n)?(i=o-Zt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Zt(t,e,n){var i=Ut(t,e,n),a=Ut(t+1,e,n);return(Dt(t)-i+a)/7}function $t(t,e){return t.slice(e,7).concat(t.slice(0,e))}j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),Y("week",5),Y("isoWeek",5),dt("w",J),dt("ww",J,Z),dt("W",J),dt("WW",J,Z),mt(["w","ww","W","WW"],(function(t,e,n,i){e[i.substr(0,1)]=k(t)})),j("d",0,"do","day"),j("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),j("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),j("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),dt("d",J),dt("e",J),dt("E",J),dt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),dt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),dt("dddd",(function(t,e){return e.weekdaysRegex(t)})),mt(["dd","ddd","dddd"],(function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t})),mt(["d","e","E"],(function(t,e,n,i){e[i]=k(t)}));var Xt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Kt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Jt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Qt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"dddd"===e?-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:"ddd"===e?-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Pt.call(this._minWeekdaysParse,o))?a:-1!==(a=Pt.call(this._weekdaysParse,o))?a:-1!==(a=Pt.call(this._shortWeekdaysParse,o))?a:null}var te=lt,ee=lt,ne=lt;function ie(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ct(s[e]),l[e]=ct(l[e]),u[e]=ct(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function ae(){return this.hours()%12||12}function re(t,e){j(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function oe(t,e){return e._meridiemParse}j("H",["HH",2],0,"hour"),j("h",["hh",2],0,ae),j("k",["kk",2],0,(function(){return this.hours()||24})),j("hmm",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)})),j("hmmss",0,0,(function(){return""+ae.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)})),j("Hmm",0,0,(function(){return""+this.hours()+z(this.minutes(),2)})),j("Hmmss",0,0,(function(){return""+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)})),re("a",!0),re("A",!1),L("hour","h"),Y("hour",13),dt("a",oe),dt("A",oe),dt("H",J),dt("h",J),dt("k",J),dt("HH",J,Z),dt("hh",J,Z),dt("kk",J,Z),dt("hmm",Q),dt("hmmss",tt),dt("Hmm",Q),dt("Hmmss",tt),gt(["H","HH"],xt),gt(["k","kk"],(function(t,e,n){var i=k(t);e[xt]=24===i?0:i})),gt(["a","A"],(function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t})),gt(["h","hh"],(function(t,e,n){e[xt]=k(t),g(n).bigHour=!0})),gt("hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i)),g(n).bigHour=!0})),gt("hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a)),g(n).bigHour=!0})),gt("Hmm",(function(t,e,n){var i=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i))})),gt("Hmmss",(function(t,e,n){var i=t.length-4,a=t.length-2;e[xt]=k(t.substr(0,i)),e[_t]=k(t.substr(i,2)),e[wt]=k(t.substr(a))}));var se,le=Ot("Hours",!0),ue={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Rt,monthsShort:Nt,week:{dow:0,doy:6},weekdays:Xt,weekdaysMin:Jt,weekdaysShort:Kt,meridiemParse:/[ap]\.?m?\.?/i},de={},he={};function ce(t){return t?t.toLowerCase().replace("_","-"):t}function fe(n){var i=null;if(!de[n]&&e&&e.exports)try{i=se._abbr,t(),ge(i)}catch(t){}return de[n]}function ge(t,e){var n;return t&&((n=s(e)?pe(t):me(t,e))?se=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),se._abbr}function me(t,e){if(null!==e){var n,i=ue;if(e.abbr=t,null!=de[t])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=de[t]._config;else if(null!=e.parentLocale)if(null!=de[e.parentLocale])i=de[e.parentLocale]._config;else{if(null==(n=fe(e.parentLocale)))return he[e.parentLocale]||(he[e.parentLocale]=[]),he[e.parentLocale].push({name:t,config:e}),null;i=n._config}return de[t]=new F(A(i,e)),he[t]&&he[t].forEach((function(t){me(t.name,t.config)})),ge(t),de[t]}return delete de[t],null}function pe(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return se;if(!r(t)){if(e=fe(t))return e;t=[t]}return function(t){for(var e,n,i,a,r=0;r<t.length;){for(e=(a=ce(t[r]).split("-")).length,n=(n=ce(t[r+1]))?n.split("-"):null;e>0;){if(i=fe(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&M(a,n,!0)>=e-1)break;e--}r++}return se}(t)}function ve(t){var e,n=t._a;return n&&-2===g(t).overflow&&(e=n[bt]<0||n[bt]>11?bt:n[yt]<1||n[yt]>It(n[vt],n[bt])?yt:n[xt]<0||n[xt]>24||24===n[xt]&&(0!==n[_t]||0!==n[wt]||0!==n[kt])?xt:n[_t]<0||n[_t]>59?_t:n[wt]<0||n[wt]>59?wt:n[kt]<0||n[kt]>999?kt:-1,g(t)._overflowDayOfYear&&(e<vt||e>yt)&&(e=yt),g(t)._overflowWeeks&&-1===e&&(e=Mt),g(t)._overflowWeekday&&-1===e&&(e=St),g(t).overflow=e),t}function be(t,e,n){return null!=t?t:null!=e?e:n}function ye(t){var e,n,i,r,o,s=[];if(!t._d){for(i=function(t){var e=new Date(a.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[yt]&&null==t._a[bt]&&function(t){var e,n,i,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,n=be(e.GG,t._a[vt],qt(Le(),1,4).year),i=be(e.W,1),((a=be(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=qt(Le(),r,o);n=be(e.gg,t._a[vt],u.year),i=be(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Zt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=Gt(n,i,a,r,o),t._a[vt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=be(t._a[vt],i[vt]),(t._dayOfYear>Dt(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),n=jt(o,0,t._dayOfYear),t._a[bt]=n.getUTCMonth(),t._a[yt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=i[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[xt]&&0===t._a[_t]&&0===t._a[wt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[xt]=0),t._d=(t._useUTC?jt:Bt).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[xt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}var xe=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_e=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,we=/Z|[+-]\d\d(?::?\d\d)?/,ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Me=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Se=/^\/?Date\((\-?\d+)/i;function De(t){var e,n,i,a,r,o,s=t._i,l=xe.exec(s)||_e.exec(s);if(l){for(g(t).iso=!0,e=0,n=ke.length;e<n;e++)if(ke[e][1].exec(l[1])){a=ke[e][0],i=!1!==ke[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=Me.length;e<n;e++)if(Me[e][1].exec(l[3])){r=(l[2]||" ")+Me[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!we.exec(l[4]))return void(t._isValid=!1);o="Z"}t._f=a+(r||"")+(o||""),Ae(t)}else t._isValid=!1}var Ce=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Pe(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}var Te={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Oe(t){var e,n,i,a,r,o,s,l=Ce.exec(t._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(l){var u=(e=l[4],n=l[3],i=l[2],a=l[5],r=l[6],o=l[7],s=[Pe(e),Nt.indexOf(n),parseInt(i,10),parseInt(a,10),parseInt(r,10)],o&&s.push(parseInt(o,10)),s);if(!function(t,e,n){return!t||Kt.indexOf(t)===new Date(e[0],e[1],e[2]).getDay()||(g(n).weekdayMismatch=!0,n._isValid=!1,!1)}(l[1],u,t))return;t._a=u,t._tzm=function(t,e,n){if(t)return Te[t];if(e)return 0;var i=parseInt(n,10),a=i%100;return(i-a)/100*60+a}(l[8],l[9],l[10]),t._d=jt.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),g(t).rfc2822=!0}else t._isValid=!1}function Ae(t){if(t._f!==a.ISO_8601)if(t._f!==a.RFC_2822){t._a=[],g(t).empty=!0;var e,n,i,r,o,s=""+t._i,l=s.length,u=0;for(i=G(t._f,t._locale).match(E)||[],e=0;e<i.length;e++)r=i[e],(n=(s.match(ht(r,t))||[])[0])&&((o=s.substr(0,s.indexOf(n))).length>0&&g(t).unusedInput.push(o),s=s.slice(s.indexOf(n)+n.length),u+=n.length),B[r]?(n?g(t).empty=!1:g(t).unusedTokens.push(r),pt(r,n,t)):t._strict&&!n&&g(t).unusedTokens.push(r);g(t).charsLeftOver=l-u,s.length>0&&g(t).unusedInput.push(s),t._a[xt]<=12&&!0===g(t).bigHour&&t._a[xt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[xt]=function(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?((i=t.isPM(n))&&e<12&&(e+=12),i||12!==e||(e=0),e):e}(t._locale,t._a[xt],t._meridiem),ye(t),ve(t)}else Oe(t);else De(t)}function Fe(t){var e=t._i,n=t._f;return t._locale=t._locale||pe(t._l),null===e||void 0===n&&""===e?p({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),_(e)?new x(ve(e)):(u(e)?t._d=e:r(n)?function(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=b({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],Ae(e),m(e)&&(r+=g(e).charsLeftOver,r+=10*g(e).unusedTokens.length,g(e).score=r,(null==i||r<i)&&(i=r,n=e));c(t,n||e)}(t):n?Ae(t):function(t){var e=t._i;s(e)?t._d=new Date(a.now()):u(e)?t._d=new Date(e.valueOf()):"string"==typeof e?function(t){var e=Se.exec(t._i);null===e?(De(t),!1===t._isValid&&(delete t._isValid,Oe(t),!1===t._isValid&&(delete t._isValid,a.createFromInputFallback(t)))):t._d=new Date(+e[1])}(t):r(e)?(t._a=d(e.slice(0),(function(t){return parseInt(t,10)})),ye(t)):o(e)?function(t){if(!t._d){var e=N(t._i);t._a=d([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],(function(t){return t&&parseInt(t,10)})),ye(t)}}(t):l(e)?t._d=new Date(e):a.createFromInputFallback(t)}(t),m(t)||(t._d=null),t))}function Ie(t,e,n,i,a){var s,l={};return!0!==n&&!1!==n||(i=n,n=void 0),(o(t)&&function(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}(t)||r(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=a,l._l=n,l._i=t,l._f=e,l._strict=i,(s=new x(ve(Fe(l))))._nextDay&&(s.add(1,"d"),s._nextDay=void 0),s}function Le(t,e,n,i){return Ie(t,e,n,i,!1)}a.createFromInputFallback=D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))})),a.ISO_8601=function(){},a.RFC_2822=function(){};var Re=D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Le.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()})),Ne=D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=Le.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()}));function We(t,e){var n,i;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Le();for(n=e[0],i=1;i<e.length;++i)e[i].isValid()&&!e[i][t](n)||(n=e[i]);return n}var Ye=["year","quarter","month","week","day","hour","minute","second","millisecond"];function ze(t){var e=N(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||e.isoWeek||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=function(t){for(var e in t)if(-1===Pt.call(Ye,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var n=!1,i=0;i<Ye.length;++i)if(t[Ye[i]]){if(n)return!1;parseFloat(t[Ye[i]])!==k(t[Ye[i]])&&(n=!0)}return!0}(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=pe(),this._bubble()}function Ee(t){return t instanceof ze}function Ve(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function He(t,e){j(t,0,0,(function(){var t=this.utcOffset(),n="+";return t<0&&(t=-t,n="-"),n+z(~~(t/60),2)+e+z(~~t%60,2)}))}He("Z",":"),He("ZZ",""),dt("Z",st),dt("ZZ",st),gt(["Z","ZZ"],(function(t,e,n){n._useUTC=!0,n._tzm=je(st,t)}));var Be=/([\+\-]|\d\d)/gi;function je(t,e){var n=(e||"").match(t);if(null===n)return null;var i=((n[n.length-1]||[])+"").match(Be)||["-",0,0],a=60*i[1]+k(i[2]);return 0===a?0:"+"===i[0]?a:-a}function Ue(t,e){var n,i;return e._isUTC?(n=e.clone(),i=(_(t)||u(t)?t.valueOf():Le(t).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+i),a.updateOffset(n,!1),n):Le(t).local()}function Ge(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function qe(){return!!this.isValid()&&this._isUTC&&0===this._offset}a.updateOffset=function(){};var Ze=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$e=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Xe(t,e){var n,i,a,r,o,s,u=t,d=null;return Ee(t)?u={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(u={},e?u[e]=t:u.milliseconds=t):(d=Ze.exec(t))?(n="-"===d[1]?-1:1,u={y:0,d:k(d[yt])*n,h:k(d[xt])*n,m:k(d[_t])*n,s:k(d[wt])*n,ms:k(Ve(1e3*d[kt]))*n}):(d=$e.exec(t))?(n="-"===d[1]?-1:1,u={y:Ke(d[2],n),M:Ke(d[3],n),w:Ke(d[4],n),d:Ke(d[5],n),h:Ke(d[6],n),m:Ke(d[7],n),s:Ke(d[8],n)}):null==u?u={}:"object"==typeof u&&("from"in u||"to"in u)&&(r=Le(u.from),o=Le(u.to),a=r.isValid()&&o.isValid()?(o=Ue(o,r),r.isBefore(o)?s=Je(r,o):((s=Je(o,r)).milliseconds=-s.milliseconds,s.months=-s.months),s):{milliseconds:0,months:0},(u={}).ms=a.milliseconds,u.M=a.months),i=new ze(u),Ee(t)&&h(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function Je(t,e){var n={};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function Qe(t,e){return function(n,i){var a;return null===i||isNaN(+i)||(T(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),a=n,n=i,i=a),tn(this,Xe(n="string"==typeof n?+n:n,i),t),this}}function tn(t,e,n,i){var r=e._milliseconds,o=Ve(e._days),s=Ve(e._months);t.isValid()&&(i=null==i||i,s&&Yt(t,At(t,"Month")+s*n),o&&Ft(t,"Date",At(t,"Date")+o*n),r&&t._d.setTime(t._d.valueOf()+r*n),i&&a.updateOffset(t,o||s))}Xe.fn=ze.prototype,Xe.invalid=function(){return Xe(NaN)};var en=Qe(1,"add"),nn=Qe(-1,"subtract");function an(t,e){var n=12*(e.year()-t.year())+(e.month()-t.month()),i=t.clone().add(n,"months");return-(n+(e-i<0?(e-i)/(i-t.clone().add(n-1,"months")):(e-i)/(t.clone().add(n+1,"months")-i)))||0}function rn(t){var e;return void 0===t?this._locale._abbr:(null!=(e=pe(t))&&(this._locale=e),this)}a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var on=D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(t){return void 0===t?this.localeData():this.locale(t)}));function sn(){return this._locale}var ln=1e3,un=60*ln,dn=60*un,hn=3506328*dn;function cn(t,e){return(t%e+e)%e}function fn(t,e,n){return t<100&&t>=0?new Date(t+400,e,n)-hn:new Date(t,e,n).valueOf()}function gn(t,e,n){return t<100&&t>=0?Date.UTC(t+400,e,n)-hn:Date.UTC(t,e,n)}function mn(t,e){j(0,[t,t.length],0,e)}function pn(t,e,n,i,a){var r;return null==t?qt(this,i,a).year:(e>(r=Zt(t,i,a))&&(e=r),vn.call(this,t,e,n,i,a))}function vn(t,e,n,i,a){var r=Gt(t,e,n,i,a),o=jt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}j(0,["gg",2],0,(function(){return this.weekYear()%100})),j(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),mn("gggg","weekYear"),mn("ggggg","weekYear"),mn("GGGG","isoWeekYear"),mn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),Y("weekYear",1),Y("isoWeekYear",1),dt("G",rt),dt("g",rt),dt("GG",J,Z),dt("gg",J,Z),dt("GGGG",nt,X),dt("gggg",nt,X),dt("GGGGG",it,K),dt("ggggg",it,K),mt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,n,i){e[i.substr(0,2)]=k(t)})),mt(["gg","GG"],(function(t,e,n,i){e[i]=a.parseTwoDigitYear(t)})),j("Q",0,"Qo","quarter"),L("quarter","Q"),Y("quarter",7),dt("Q",q),gt("Q",(function(t,e){e[bt]=3*(k(t)-1)})),j("D",["DD",2],"Do","date"),L("date","D"),Y("date",9),dt("D",J),dt("DD",J,Z),dt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),gt(["D","DD"],yt),gt("Do",(function(t,e){e[yt]=k(t.match(J)[0])}));var bn=Ot("Date",!0);j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),Y("dayOfYear",4),dt("DDD",et),dt("DDDD",$),gt(["DDD","DDDD"],(function(t,e,n){n._dayOfYear=k(t)})),j("m",["mm",2],0,"minute"),L("minute","m"),Y("minute",14),dt("m",J),dt("mm",J,Z),gt(["m","mm"],_t);var yn=Ot("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),Y("second",15),dt("s",J),dt("ss",J,Z),gt(["s","ss"],wt);var xn,_n=Ot("Seconds",!1);for(j("S",0,0,(function(){return~~(this.millisecond()/100)})),j(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),j(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),j(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),j(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),j(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),j(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),L("millisecond","ms"),Y("millisecond",16),dt("S",et,q),dt("SS",et,Z),dt("SSS",et,$),xn="SSSS";xn.length<=9;xn+="S")dt(xn,at);function wn(t,e){e[kt]=k(1e3*("0."+t))}for(xn="S";xn.length<=9;xn+="S")gt(xn,wn);var kn=Ot("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Mn=x.prototype;function Sn(t){return t}Mn.add=en,Mn.calendar=function(t,e){var n=t||Le(),i=Ue(n,this).startOf("day"),r=a.calendarFormat(this,i)||"sameElse",o=e&&(O(e[r])?e[r].call(this,n):e[r]);return this.format(o||this.localeData().calendar(r,this,Le(n)))},Mn.clone=function(){return new x(this)},Mn.diff=function(t,e,n){var i,a,r;if(!this.isValid())return NaN;if(!(i=Ue(t,this)).isValid())return NaN;switch(a=6e4*(i.utcOffset()-this.utcOffset()),e=R(e)){case"year":r=an(this,i)/12;break;case"month":r=an(this,i);break;case"quarter":r=an(this,i)/3;break;case"second":r=(this-i)/1e3;break;case"minute":r=(this-i)/6e4;break;case"hour":r=(this-i)/36e5;break;case"day":r=(this-i-a)/864e5;break;case"week":r=(this-i-a)/6048e5;break;default:r=this-i}return n?r:w(r)},Mn.endOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year()+1,0,1)-1;break;case"quarter":e=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=n(this.year(),this.month()+1,1)-1;break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=dn-cn(e+(this._isUTC?0:this.utcOffset()*un),dn)-1;break;case"minute":e=this._d.valueOf(),e+=un-cn(e,un)-1;break;case"second":e=this._d.valueOf(),e+=ln-cn(e,ln)-1}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.format=function(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},Mn.from=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.fromNow=function(t){return this.from(Le(),t)},Mn.to=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Le(t).isValid())?Xe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},Mn.toNow=function(t){return this.to(Le(),t)},Mn.get=function(t){return O(this[t=R(t)])?this[t]():this},Mn.invalidAt=function(){return g(this).overflow},Mn.isAfter=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf())},Mn.isBefore=function(t,e){var n=_(t)?t:Le(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf())},Mn.isBetween=function(t,e,n,i){var a=_(t)?t:Le(t),r=_(e)?e:Le(e);return!!(this.isValid()&&a.isValid()&&r.isValid())&&("("===(i=i||"()")[0]?this.isAfter(a,n):!this.isBefore(a,n))&&(")"===i[1]?this.isBefore(r,n):!this.isAfter(r,n))},Mn.isSame=function(t,e){var n,i=_(t)?t:Le(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=R(e)||"millisecond")?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf()))},Mn.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},Mn.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},Mn.isValid=function(){return m(this)},Mn.lang=on,Mn.locale=rn,Mn.localeData=sn,Mn.max=Ne,Mn.min=Re,Mn.parsingFlags=function(){return c({},g(this))},Mn.set=function(t,e){if("object"==typeof t)for(var n=function(t){var e=[];for(var n in t)e.push({unit:n,priority:W[n]});return e.sort((function(t,e){return t.priority-e.priority})),e}(t=N(t)),i=0;i<n.length;i++)this[n[i].unit](t[n[i].unit]);else if(O(this[t=R(t)]))return this[t](e);return this},Mn.startOf=function(t){var e;if(void 0===(t=R(t))||"millisecond"===t||!this.isValid())return this;var n=this._isUTC?gn:fn;switch(t){case"year":e=n(this.year(),0,1);break;case"quarter":e=n(this.year(),this.month()-this.month()%3,1);break;case"month":e=n(this.year(),this.month(),1);break;case"week":e=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=n(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=cn(e+(this._isUTC?0:this.utcOffset()*un),dn);break;case"minute":e=this._d.valueOf(),e-=cn(e,un);break;case"second":e=this._d.valueOf(),e-=cn(e,ln)}return this._d.setTime(e),a.updateOffset(this,!0),this},Mn.subtract=nn,Mn.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},Mn.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},Mn.toDate=function(){return new Date(this.valueOf())},Mn.toISOString=function(t){if(!this.isValid())return null;var e=!0!==t,n=e?this.clone().utc():this;return n.year()<0||n.year()>9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Mn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a=e+'[")]';return this.format(n+i+"-MM-DD[T]HH:mm:ss.SSS"+a)},Mn.toJSON=function(){return this.isValid()?this.toISOString():null},Mn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Mn.unix=function(){return Math.floor(this.valueOf()/1e3)},Mn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Mn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Mn.year=Tt,Mn.isLeapYear=function(){return Ct(this.year())},Mn.weekYear=function(t){return pn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Mn.isoWeekYear=function(t){return pn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},Mn.quarter=Mn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},Mn.month=zt,Mn.daysInMonth=function(){return It(this.year(),this.month())},Mn.week=Mn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},Mn.isoWeek=Mn.isoWeeks=function(t){var e=qt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},Mn.weeksInYear=function(){var t=this.localeData()._week;return Zt(this.year(),t.dow,t.doy)},Mn.isoWeeksInYear=function(){return Zt(this.year(),1,4)},Mn.date=bn,Mn.day=Mn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},Mn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},Mn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},Mn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},Mn.hour=Mn.hours=le,Mn.minute=Mn.minutes=yn,Mn.second=Mn.seconds=_n,Mn.millisecond=Mn.milliseconds=kn,Mn.utcOffset=function(t,e,n){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=je(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(i=Ge(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!e||this._changeInProgress?tn(this,Xe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Ge(this)},Mn.utc=function(t){return this.utcOffset(0,t)},Mn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ge(this),"m")),this},Mn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=je(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},Mn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Le(t).utcOffset():0,(this.utcOffset()-t)%60==0)},Mn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Mn.isUtc=qe,Mn.isUTC=qe,Mn.zoneAbbr=function(){return this._isUTC?"UTC":""},Mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Mn.dates=D("dates accessor is deprecated. Use date instead.",bn),Mn.months=D("months accessor is deprecated. Use month instead",zt),Mn.years=D("years accessor is deprecated. Use year instead",Tt),Mn.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()})),Mn.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),(t=Fe(t))._a){var e=t._isUTC?f(t._a):Le(t._a);this._isDSTShifted=this.isValid()&&M(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}));var Dn=F.prototype;function Cn(t,e,n,i){var a=pe(),r=f().set(i,e);return a[n](r,t)}function Pn(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Cn(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=Cn(t,i,n,"month");return a}function Tn(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var a,r=pe(),o=t?r._week.dow:0;if(null!=n)return Cn(e,(n+o)%7,i,"day");var s=[];for(a=0;a<7;a++)s[a]=Cn(e,(a+o)%7,i,"day");return s}Dn.calendar=function(t,e,n){var i=this._calendar[t]||this._calendar.sameElse;return O(i)?i.call(e,n):i},Dn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])},Dn.invalidDate=function(){return this._invalidDate},Dn.ordinal=function(t){return this._ordinal.replace("%d",t)},Dn.preparse=Sn,Dn.postformat=Sn,Dn.relativeTime=function(t,e,n,i){var a=this._relativeTime[n];return O(a)?a(t,e,n,i):a.replace(/%d/i,t)},Dn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return O(n)?n(e):n.replace(/%s/i,e)},Dn.set=function(t){var e,n;for(n in t)O(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},Dn.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Lt).test(e)?"format":"standalone"][t.month()]:r(this._months)?this._months:this._months.standalone},Dn.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Lt.test(e)?"format":"standalone"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},Dn.monthsParse=function(t,e,n){var i,a,r;if(this._monthsParseExact)return Wt.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(a=f([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}},Dn.monthsRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsStrictRegex:this._monthsRegex):(h(this,"_monthsRegex")||(this._monthsRegex=Vt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},Dn.monthsShortRegex=function(t){return this._monthsParseExact?(h(this,"_monthsRegex")||Ht.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,"_monthsShortRegex")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},Dn.week=function(t){return qt(t,this._week.dow,this._week.doy).week},Dn.firstDayOfYear=function(){return this._week.doy},Dn.firstDayOfWeek=function(){return this._week.dow},Dn.weekdays=function(t,e){var n=r(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?$t(n,this._week.dow):t?n[t.day()]:n},Dn.weekdaysMin=function(t){return!0===t?$t(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin},Dn.weekdaysShort=function(t){return!0===t?$t(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort},Dn.weekdaysParse=function(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Qt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}},Dn.weekdaysRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=te),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},Dn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ee),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},Dn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||ie.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ne),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},Dn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},Dn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ge("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),a.lang=D("moment.lang is deprecated. Use moment.locale instead.",ge),a.langData=D("moment.langData is deprecated. Use moment.localeData instead.",pe);var On=Math.abs;function An(t,e,n,i){var a=Xe(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function Fn(t){return t<0?Math.floor(t):Math.ceil(t)}function In(t){return 4800*t/146097}function Ln(t){return 146097*t/4800}function Rn(t){return function(){return this.as(t)}}var Nn=Rn("ms"),Wn=Rn("s"),Yn=Rn("m"),zn=Rn("h"),En=Rn("d"),Vn=Rn("w"),Hn=Rn("M"),Bn=Rn("Q"),jn=Rn("y");function Un(t){return function(){return this.isValid()?this._data[t]:NaN}}var Gn=Un("milliseconds"),qn=Un("seconds"),Zn=Un("minutes"),$n=Un("hours"),Xn=Un("days"),Kn=Un("months"),Jn=Un("years"),Qn=Math.round,ti={ss:44,s:45,m:45,h:22,d:26,M:11};function ei(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}var ni=Math.abs;function ii(t){return(t>0)-(t<0)||+t}function ai(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=ni(this._milliseconds)/1e3,i=ni(this._days),a=ni(this._months);t=w(n/60),e=w(t/60),n%=60,t%=60;var r=w(a/12),o=a%=12,s=i,l=e,u=t,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=ii(this._months)!==ii(h)?"-":"",g=ii(this._days)!==ii(h)?"-":"",m=ii(this._milliseconds)!==ii(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(o?f+o+"M":"")+(s?g+s+"D":"")+(l||u||d?"T":"")+(l?m+l+"H":"")+(u?m+u+"M":"")+(d?m+d+"S":"")}var ri=ze.prototype;return ri.isValid=function(){return this._isValid},ri.abs=function(){var t=this._data;return this._milliseconds=On(this._milliseconds),this._days=On(this._days),this._months=On(this._months),t.milliseconds=On(t.milliseconds),t.seconds=On(t.seconds),t.minutes=On(t.minutes),t.hours=On(t.hours),t.months=On(t.months),t.years=On(t.years),this},ri.add=function(t,e){return An(this,t,e,1)},ri.subtract=function(t,e){return An(this,t,e,-1)},ri.as=function(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if("month"===(t=R(t))||"quarter"===t||"year"===t)switch(e=this._days+i/864e5,n=this._months+In(e),t){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(e=this._days+Math.round(Ln(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}},ri.asMilliseconds=Nn,ri.asSeconds=Wn,ri.asMinutes=Yn,ri.asHours=zn,ri.asDays=En,ri.asWeeks=Vn,ri.asMonths=Hn,ri.asQuarters=Bn,ri.asYears=jn,ri.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},ri._bubble=function(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*Fn(Ln(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=w(r/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,o+=w(n/24),a=w(In(o)),s+=a,o-=Fn(Ln(a)),i=w(s/12),s%=12,l.days=o,l.months=s,l.years=i,this},ri.clone=function(){return Xe(this)},ri.get=function(t){return t=R(t),this.isValid()?this[t+"s"]():NaN},ri.milliseconds=Gn,ri.seconds=qn,ri.minutes=Zn,ri.hours=$n,ri.days=Xn,ri.weeks=function(){return w(this.days()/7)},ri.months=Kn,ri.years=Jn,ri.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var i=Xe(t).abs(),a=Qn(i.as("s")),r=Qn(i.as("m")),o=Qn(i.as("h")),s=Qn(i.as("d")),l=Qn(i.as("M")),u=Qn(i.as("y")),d=a<=ti.ss&&["s",a]||a<ti.s&&["ss",a]||r<=1&&["m"]||r<ti.m&&["mm",r]||o<=1&&["h"]||o<ti.h&&["hh",o]||s<=1&&["d"]||s<ti.d&&["dd",s]||l<=1&&["M"]||l<ti.M&&["MM",l]||u<=1&&["y"]||["yy",u];return d[2]=e,d[3]=+t>0,d[4]=n,ei.apply(null,d)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},ri.toISOString=ai,ri.toString=ai,ri.toJSON=ai,ri.locale=rn,ri.localeData=sn,ri.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ai),ri.lang=on,j("X",0,0,"unix"),j("x",0,0,"valueOf"),dt("x",rt),dt("X",/[+-]?\d+(\.\d{1,3})?/),gt("X",(function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))})),gt("x",(function(t,e,n){n._d=new Date(k(t))})),a.version="2.24.0",n=Le,a.fn=Mn,a.min=function(){return We("isBefore",[].slice.call(arguments,0))},a.max=function(){return We("isAfter",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=f,a.unix=function(t){return Le(1e3*t)},a.months=function(t,e){return Pn(t,e,"months")},a.isDate=u,a.locale=ge,a.invalid=p,a.duration=Xe,a.isMoment=_,a.weekdays=function(t,e,n){return Tn(t,e,n,"weekdays")},a.parseZone=function(){return Le.apply(null,arguments).parseZone()},a.localeData=pe,a.isDuration=Ee,a.monthsShort=function(t,e){return Pn(t,e,"monthsShort")},a.weekdaysMin=function(t,e,n){return Tn(t,e,n,"weekdaysMin")},a.defineLocale=me,a.updateLocale=function(t,e){if(null!=e){var n,i,a=ue;null!=(i=fe(t))&&(a=i._config),e=A(a,e),(n=new F(e)).parentLocale=de[t],de[t]=n,ge(t)}else null!=de[t]&&(null!=de[t].parentLocale?de[t]=de[t].parentLocale:null!=de[t]&&delete de[t]);return de[t]},a.locales=function(){return C(de)},a.weekdaysShort=function(t,e,n){return Tn(t,e,n,"weekdaysShort")},a.normalizeUnits=R,a.relativeTimeRounding=function(t){return void 0===t?Qn:"function"==typeof t&&(Qn=t,!0)},a.relativeTimeThreshold=function(t,e){return void 0!==ti[t]&&(void 0===e?ti[t]:(ti[t]=e,"s"===t&&(ti.ss=e-1),!0))},a.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},a.prototype=Mn,a.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},a}()})),pi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};on._date.override("function"==typeof mi?{_id:"moment",formats:function(){return pi},parse:function(t,e){return"string"==typeof t&&"string"==typeof e?t=mi(t,e):t instanceof mi||(t=mi(t)),t.isValid()?t.valueOf():null},format:function(t,e){return mi(t).format(e)},add:function(t,e,n){return mi(t).add(e,n).valueOf()},diff:function(t,e,n){return mi(t).diff(mi(e),n)},startOf:function(t,e,n){return t=mi(t),"isoWeek"===e?t.isoWeekday(n).valueOf():t.startOf(e).valueOf()},endOf:function(t,e){return mi(t).endOf(e).valueOf()},_create:function(t){return mi(t)}}:{}),Y._set("global",{plugins:{filler:{propagate:!0}}});var vi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return B.isArray(e)?function(t,n){return e[n]}:function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};function bi(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function yi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a<l;++a)r="start"===u||"end"===u?o.getPointPositionForValue(a,"start"===u?e:n):o.getBasePosition(a),s.gridLines.circular&&(r.cx=i.x,r.cy=i.y,r.angle=o.getIndexAngle(a)-Math.PI/2),d.push(r);return d}(t):function(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePixel&&(r=i.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(B.isFinite(r))return{x:(e=i.isHorizontal())?r:null,y:e?null:r}}return null}(t)}function xi(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function _i(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),vi[n](t))}function wi(t){return t&&!t.skip}function ki(t,e,n,i,a){var r,o,s,l;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)B.canvas.lineTo(t,e[r-1],e[r]);if(void 0===n[0].angle)for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)B.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function Mi(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,m=i.spanGaps,p=[],v=[],b=0,y=0;for(t.beginPath(),o=0,s=g;o<s;++o)d=n(u=e[l=o%g]._view,l,i),h=wi(u),c=wi(d),r&&void 0===f&&h&&(s=g+(f=o+1)),h&&c?(b=p.push(u),y=v.push(d)):b&&y&&(m?(h&&p.push(u),c&&v.push(d)):(ki(t,p,v,b,y),b=y=0,p=[],v=[]));ki(t,p,v,b,y),t.closePath(),t.fillStyle=a,t.fill()}var Si={id:"filler",afterDatasetsUpdate:function(t,e){var n,i,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(i=0;i<o;++i)r=null,(a=(n=t.getDatasetMeta(i)).dataset)&&a._model&&a instanceof kt.Line&&(r={visible:t.isDatasetVisible(i),fill:bi(a,i,o),chart:t,el:a}),n.$filler=r,l.push(r);for(i=0;i<o;++i)(r=l[i])&&(r.fill=xi(l,i,s),r.boundary=yi(r),r.mapper=_i(r))},beforeDatasetsDraw:function(t){var e,n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas(),u=t.ctx;for(n=l.length-1;n>=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||Y.global.defaultColor,o&&s&&r.length&&(B.canvas.clipArea(u,t.chartArea),Mi(u,r,o,a,s,i._loop),B.canvas.unclipArea(u)))}},Di=B.rtl.getRtlAdapter,Ci=B.noop,Pi=B.valueOrDefault;function Ti(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}Y._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e<n;e++)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[e].backgroundColor,r[e].label&&i.appendChild(document.createTextNode(r[e].label));return a.outerHTML}});var Oi=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:Ci,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ci,beforeSetDimensions:Ci,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ci,beforeBuildLabels:Ci,buildLabels:function(){var t=this,e=t.options.labels||{},n=B.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter((function(n){return e.filter(n,t.chart.data)}))),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:Ci,beforeFit:Ci,fit:function(){var t=this,e=t.options,n=e.labels,i=e.display,a=t.ctx,r=B.options._parseFont(n),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=i?10:0):(l.width=i?10:0,l.height=t.maxHeight),i){if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="middle",B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+i+2*n.padding>l.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],m=n.padding,p=0,v=0;B.each(t.legendItems,(function(t,e){var i=Ti(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(m+=p+n.padding,f.push(p),g.push(v),p=0,v=0),p=Math.max(p,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),m+=p,f.push(p),g.push(v),l.width+=m}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Ci,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=Y.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=Di(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Pi(n.fontColor,i.defaultFontColor),g=B.options._parseFont(n),m=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var p=Ti(n,m),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},y=t.isHorizontal();d=y?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},B.rtl.overrideTextDirection(t.ctx,e.textDirection);var x=m+n.padding;B.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=p+m/2+f,_=d.x,w=d.y;h.setWidth(t.minSize.width),y?i>0&&_+g+n.padding>t.left+t.minSize.width&&(w=d.y+=x,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&w+x>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,w=d.y=t.top+b(o,s[d.line]));var k=h.x(_);!function(t,e,i){if(!(isNaN(p)||p<=0)){c.save();var o=Pi(i.lineWidth,r.borderWidth);if(c.fillStyle=Pi(i.fillStyle,a),c.lineCap=Pi(i.lineCap,r.borderCapStyle),c.lineDashOffset=Pi(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Pi(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Pi(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Pi(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=p*Math.SQRT2/2,l=h.xPlus(t,p/2),u=e+m/2;B.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,p),e,p,m),0!==o&&c.strokeRect(h.leftForLtr(t,p),e,p,m);c.restore()}}(k,w,e),v[i].left=h.leftForLtr(k,v[i].width),v[i].top=w,function(t,e,n,i){var a=m/2,r=h.xPlus(t,p+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(k,w,e,f),y?d.x+=g+n.padding:d.y+=x})),B.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n<a.length;++n)if(t>=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Oi({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.legend=n}var Fi={id:"legend",_element:Oi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(B.mergeIf(e,Y.global.legend),n?(pe.configure(t,n,e),n.options=e):Ai(t,e)):n&&(pe.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ii=B.noop;Y._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Li=X.extend({initialize:function(t){B.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ii,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ii,beforeSetDimensions:Ii,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ii,beforeBuildLabels:Ii,buildLabels:Ii,afterBuildLabels:Ii,beforeFit:Ii,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(B.isArray(n.text)?n.text.length:1)*B.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ii,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=B.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=B.valueOrDefault(n.fontColor,Y.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(B.isArray(g))for(var m=0,p=0;p<g.length;++p)e.fillText(g[p],0,m,i),m+=s;else e.fillText(g,0,0,i);e.restore()}}});function Ri(t,e){var n=new Li({ctx:t.ctx,options:e,chart:t});pe.configure(t,n,e),pe.addBox(t,n),t.titleBlock=n}var Ni={},Wi=Si,Yi=Fi,zi={id:"title",_element:Li,beforeInit:function(t){var e=t.options.title;e&&Ri(t,e)},beforeUpdate:function(t){var e=t.options.title,n=t.titleBlock;e?(B.mergeIf(e,Y.global.title),n?(pe.configure(t,n,e),n.options=e):Ri(t,e)):n&&(pe.removeBox(t,n),delete t.titleBlock)}};for(var Ei in Ni.filler=Wi,Ni.legend=Yi,Ni.title=zi,nn.helpers=B,function(){function t(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function e(t){return null!=t&&"none"!==t}function n(n,i,a){var r=document.defaultView,o=B._getParentNode(n),s=r.getComputedStyle(n)[i],l=r.getComputedStyle(o)[i],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,n,a):h,d?t(l,o,a):h):"none"}B.where=function(t,e){if(B.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return B.each(t,(function(t){e(t)&&n.push(t)})),n},B.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},B.findNextWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},B.findPreviousWhere=function(t,e,n){B.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},B.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},B.almostEquals=function(t,e,n){return Math.abs(t-e)<n},B.almostWhole=function(t,e){var n=Math.round(t);return n-e<=t&&n+e>=t},B.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},B.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},B.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},B.toRadians=function(t){return t*(Math.PI/180)},B.toDegrees=function(t){return t*(180/Math.PI)},B._decimalPlaces=function(t){if(B.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},B.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},B.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},B.aliasPixel=function(t){return t%2==0?0:.5},B._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},B.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},B.EPSILON=Number.EPSILON||1e-14,B.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e<h;++e)if(!(i=d[e]).model.skip){if(n=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-i.model.x;i.deltaK=0!==c?(a.model.y-i.model.y)/c:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}for(e=0;e<h-1;++e)i=d[e],a=d[e+1],i.model.skip||a.model.skip||(B.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(r=i.mK/i.deltaK,o=a.mK/i.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),i.mK=r*s*i.deltaK,a.mK=o*s*i.deltaK)));for(e=0;e<h;++e)(i=d[e]).model.skip||(n=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,n&&!n.model.skip&&(u=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-u,i.model.controlPointPreviousY=i.model.y-u*i.mK),a&&!a.model.skip&&(u=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+u,i.model.controlPointNextY=i.model.y+u*i.mK))},B.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},B.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},B.niceNum=function(t,e){var n=Math.floor(B.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},B.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},B.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(B.getStyle(r,"padding-left")),u=parseFloat(B.getStyle(r,"padding-top")),d=parseFloat(B.getStyle(r,"padding-right")),h=parseFloat(B.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},B.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},B.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},B._calculatePadding=function(t,e,n){return(e=B.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},B._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},B.getMaximumWidth=function(t){var e=B._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-B._calculatePadding(e,"padding-left",n)-B._calculatePadding(e,"padding-right",n),a=B.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},B.getMaximumHeight=function(t){var e=B._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-B._calculatePadding(e,"padding-top",n)-B._calculatePadding(e,"padding-bottom",n),a=B.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},B.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},B.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},B.fontString=function(t,e,n){return e+" "+t+"px "+n},B.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;o<c;o++)if(null!=(u=n[o])&&!0!==B.isArray(u))h=B.measureText(t,a,r,h,u);else if(B.isArray(u))for(s=0,l=u.length;s<l;s++)null==(d=u[s])||B.isArray(d)||(h=B.measureText(t,a,r,h,d));var f=r.length/2;if(f>n.length){for(o=0;o<f;o++)delete a[r[o]];r.splice(0,f)}return h},B.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},B.numberOfLabelLines=function(t){var e=1;return B.each(t,(function(t){B.isArray(t)&&t.length>e&&(e=t.length)})),e},B.color=w?function(t){return t instanceof CanvasGradient&&(t=Y.global.defaultColor),w(t)}:function(t){return console.error("Color.js not found!"),t},B.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:B.color(t).saturate(.5).darken(.1).rgbString()}}(),nn._adapters=on,nn.Animation=J,nn.animationService=Q,nn.controllers=Qt,nn.DatasetController=at,nn.defaults=Y,nn.Element=X,nn.elements=kt,nn.Interaction=oe,nn.layouts=pe,nn.platform=Le,nn.plugins=Re,nn.Scale=_n,nn.scaleService=Ne,nn.Ticks=sn,nn.Tooltip=qe,nn.helpers.each(gi,(function(t,e){nn.scaleService.registerScaleType(e,t,t._defaults)})),Ni)Ni.hasOwnProperty(Ei)&&nn.plugins.register(Ni[Ei]);nn.platform.initialize();var Vi=nn;return"undefined"!=typeof window&&(window.Chart=nn),nn.Chart=nn,nn.Legend=Ni.legend._element,nn.Title=Ni.title._element,nn.pluginService=nn.plugins,nn.PluginBase=nn.Element.extend({}),nn.canvasHelpers=nn.helpers.canvas,nn.layoutService=nn.layouts,nn.LinearScaleBase=Cn,nn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){nn[t]=function(e,n){return new nn(e,nn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Vi}));
diff --git a/resources/views/pdf/dossierCyberSecurite/cover.blade.php b/resources/views/pdf/dossierCyberSecurite/cover.blade.php
index e8df4afeb700360631f96b6948873c8e60a4c24e..ab4fbf1af9b2f8183316852a040ec746103fe8fc 100644
--- a/resources/views/pdf/dossierCyberSecurite/cover.blade.php
+++ b/resources/views/pdf/dossierCyberSecurite/cover.blade.php
@@ -29,8 +29,10 @@
     </div>
 
     <h3 style="text-align:center;margin-top: 50px;margin-left: 3%;">Dossier cybersécurité - {{ $date }}</h3>
-    <p style="margin-left: 160px;margin-top:20%">Référent élu : {{ $elu }}</p>
-    <p style="margin-left: 160px">Référent agent : {{ $agent }}</p>
-    <p style="margin-left: 160px">Version du référentiel :  {{ $referentiel }}</p>
+<p style="margin-left: 160px;margin-top:20%">Responsable de l'organisation : {{ $organization->referent->firstname }} {{ $organization->referent->lastname }}</p>
+<p style="margin-left: 160px;">Responsable cybersécurité : {{ $organization->referentCyber->firstname }} {{ $organization->referentCyber->lastname }}</p>
+<p style="margin-left: 160px;">Responsable élu cybersécurité : {{ $organization->referentElu->firstname }} {{ $organization->referentElu->lastname }}</p>
+
+<p style="margin-left: 160px">Version du référentiel :  {{ $referentiel }}</p>
 </body>
 </html>
diff --git a/resources/views/pdf/dossierCyberSecurite/dossier.blade.php b/resources/views/pdf/dossierCyberSecurite/dossier.blade.php
index 18bf97339449084b4caf198e71f9c57de8102455..afa445684631bfa115e3934c447d3859a9b46bb6 100644
--- a/resources/views/pdf/dossierCyberSecurite/dossier.blade.php
+++ b/resources/views/pdf/dossierCyberSecurite/dossier.blade.php
@@ -9,10 +9,9 @@
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">    <!-- JavaScript Bundle with Popper -->
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/fontawesome.min.css"/>
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/solid.min.css"/>
-{{--    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js--}}
-{{--"></script>--}}
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.bundle.min.js"></script>
+    <script>
+        @include('pdf.dossierCyberSecurite.chart-bundle')
+    </script>
 
     <script>
         // wkhtmltopdf 0.12.5 crash fix.
@@ -39,6 +38,7 @@
     <style>
         body {
             padding: 4em;
+            text-align: justify;
         }
         .table_actions {
             border-left: 0.01em solid #ccc;
@@ -133,20 +133,20 @@
     <p>Le dossier cybersécurité de {{ $organization['name'] }} (nom de la collectivité) utilise la méthode Cybersécurité Mutualisée des Territoires (CMT) qui permet aux communes de moins de cinq mille habitants d’évaluer et de développer leur maturité en matière de cybersécurité.<br>
         La méthode CMT s’adresse aux élus et décideurs des collectivités territoriales avec pour objectif de leur permettre de mieux appréhender le phénomène des cybermenaces et de leur permettre d’agir simplement et efficacement pour contrer les dangers du cyberespace.
     </p>
-    <p>La méthodologie CMT est adossée/couplée au logiciel <i>Madis cyber</i> qui permet de garantir le cadre méthodologique défini en quatre ateliers :</p>
+    <p>La méthodologie CMT est adossée/couplée au logiciel&nbsp;<i>&nbsp;Madis cyber</i> qui permet de garantir le cadre méthodologique défini en quatre ateliers :</p>
     <p style="margin-left: 80px;">
         Atelier A : Votre perception du danger cyber<br>
         Atelier B : Vos mesures de protection<br>
         Atelier C : Votre plan d’action priorisé<br>
         Atelier D : Votre maturité à la cybersécurité<br><br>
     </p>
-    <p>Ce dossier est produit par le logiciel <i>Madis cyber</i>.</p>
+    <p>Ce dossier est produit par le logiciel&nbsp;<i>&nbsp;Madis cyber</i>.</p>
     <div class="page-break"></div>
 
     {{-- 2.	Analyse des risques --}}
     <h3>2. Analyse des risques</h3>
     <h5 style="margin-left: 25px">2.1 - Atelier A: Votre perception du danger cyber</h5>
-    <p>A travers le premier atelier, le référent sécurité de {{ $organization['name'] }} prend connaissance des dangers auxquels sont exposés les collectivités de moins de 5 000 habitants puis il est guidé par l’outil <i>Madis cyber</i> pour transformer sa vision du sujet en une évaluation utilisable dans une analyse des risques.<br>
+    <p>A travers le premier atelier, le référent sécurité de {{ $organization['name'] }} prend connaissance des dangers auxquels sont exposés les collectivités de moins de 5 000 habitants puis il est guidé par l’outil&nbsp;<i>&nbsp;Madis cyber</i> pour transformer sa vision du sujet en une évaluation utilisable dans une analyse des risques.<br>
         En synthèse, la perception du danger cyber qui pèse sur {{ $organization['name'] }} est la suivante :
     </p>
     <div class="card card-info mt-4">
@@ -165,10 +165,10 @@
                 </thead>
                 @if ($evaluation->dangerLevels)
                     <tbody>
-                    @foreach($evaluation->dangerLevels as $dangerLevel )
+                    @foreach($evaluation->dangerLevels->sortBy('value') as $dangerLevel )
                         <tr>
-                            <td> {{$dangerLevel->danger['name']}} </td>
-                            <td><span class="badge" style="background-color: {{$dangerLevel->level['color']}};color: white;padding: 0.5em 1em;border-radius: 0.25em">{{$dangerLevel->level['name']}}</span></td>
+                            <td> {{$dangerLevel->danger['name']}} {{$dangerLevel->level['value']}}</td>
+                            <td><span class="badge" style="background-color: {{$dangerLevel->level['color']}};padding: 0.5em 1em;border-radius: 0.25em; @if ($dangerLevel->level['value'] == 50) color: black; @else color: white; @endif">{{$dangerLevel->level['name']}}</span></td>
                         </tr>
                     @endforeach
                     </tbody>
@@ -206,20 +206,21 @@
     </div>
     <div class="page-break"></div>
 
-    <h5 style="margin-left: 25px">2.2 - Analyse des risques cyber</h5>
+    <h4 style="margin-left: 25px">2.2 - Analyse des risques cyber</h4>
     <br>
-    <p>A travers le deuxième atelier, le référent sécurité de DEMOVILLE est guidé afin d’identifier l’ensemble des mesures de sécurité déjà mises en œuvre au sein de sa collectivité. Cela lui permet ensuite d’obtenir une évaluation de la vraisemblance des scénarios d’attaques les plus fréquents dans les collectivités de moins de 5 000 habitants et de connaître son niveau d’exposition.<br>
+    <p>A travers le deuxième atelier, le référent sécurité de {{$organization['name']}} est guidé afin d’identifier l’ensemble des mesures de sécurité déjà mises en œuvre au sein de sa collectivité. Cela lui permet ensuite d’obtenir une évaluation de la vraisemblance des scénarios d’attaques les plus fréquents dans les collectivités de moins de 5 000 habitants et de connaître son niveau d’exposition.<br>
         En synthèse, l’analyse des risques cyber donne les résultats illustrés ci-dessous :
     </p>
     <p>On peut évaluer la maturité des mesures de sécurité mises en place actuellement telle que : </p>
 
     {{-- graphe mesures de securité --}}
-    @foreach ($evaluation->measureLevels as $action)
+    @foreach ($evaluation->measureLevels as $k => $action)
         <div style="padding-top: 2em;padding-left: 10px;border: none;width: 25%;float:left">
             <div style="border: 1px solid #4281A4;padding:0.5em 1em;">
-                <h5 style="text-align: center;font-weight: bolder;height: 50px">{{$action->measure['short_name']}}</h5>
+                <p style="text-align: center;font-weight: bolder;height: 50px">
+                    {{$action->measure['short_name']}}
+                </p>
                 @include('pdf.dossierCyberSecurite.measure_circle')
-                <p style="text-align: center;">Efficacité</p>
             </div>
         </div>
     @endforeach
@@ -245,7 +246,7 @@
     </div>
     <div class="page-break"></div>
 
-    <h5 style="margin-left: 25px">2.3 - Maturité à la cybersécurité</h5>
+    <h4 style="margin-left: 25px">2.3 - Maturité à la cybersécurité</h4>
     <br>
     <p>L’évolution de la maturité cyber permet d’évaluer non seulement la capacité de la collectivité à mettre en œuvre le plan d’action cyber mais aussi d’assurer que l’utilisation de Madis cyber apporte un réel bénéfice aux acteurs du plan d’action.<br>
         La maturité en matière cybersécurité est la suivante.
@@ -254,7 +255,7 @@
     <div class="reportGraph">
         <canvas id="maturityGraph" style="width: 900px; height: 500px" width="1800" height="1000"></canvas>
     </div>
-    <p>L’indice synthétique de maturité en date du {{ $date }} est de <b>{{ number_format(collect($maturityData['data'])->avg(), 1, ',') }}. (moyenne arrondie inf 0,1 des axes)</b></p>
+    <p>L’indice synthétique de maturité en date du {{ $date }} est de&nbsp;<b>&nbsp;{{ number_format(collect($maturityData['data'])->avg(), 1, ',') }}. (moyenne arrondie inf 0,1 des axes)</b></p>
     <div class="page-break"></div>
 
     <h3>3. Plan d'action</h3>
@@ -297,7 +298,7 @@
     <div class="page-break"></div>
     <h5 style="margin-left: 25px">3.2 - Liste des risques cyber résiduels.</h5>
     <br>
-    <p>Les risques cyber résiduels sont les risques pour lesquels vous n’avez pas mis en place de mesure de protection :</p>
+    <p>Les risques cyber résiduels sont les risques pour lesquels vous n’avez pas mis en place de mesures de protection :</p>
     @foreach($residualRisks as $residual)
     <p style="margin-left: 25px">•	{{$residual->name}}</p>
     @endforeach
@@ -310,16 +311,14 @@
     {{-- 4.	Politique de cybersécurité --}}
     <h3>4. Politique de cybersécurité</h3>
     <p>La politique de sécurité permet de visualiser quelles sont les mesures de sécurité mises en œuvre au sein de {{ $organization['name'] }}.</p>
-    @foreach ($evaluation->measureLevels as $measure)
-        @if($measure->id ===6)
-            <div class="page-break"></div>
-        @endif
-        @if ($measure->expected_level === null)
+    @foreach ($evaluation->measureLevels as $k => $measure)
+        <div style="page-break-inside: avoid;padding-top: 2em;margin-bottom:-1em">
+        @if ($measure->expected_level === null || $measure->expected_level === 0)
             @if($measure->actual_level === 0 )
-                <h5 style="margin-left: 25px">4.{{ $measure->id }} - {{$measure->measure['short_name']}} [0]</h5>
+                <h5 style="margin-left: 25px">4.{{ $k+1 }} - {{$measure->measure['short_name']}} [0]</h5>
                 <p><i>La collectivité ne dispose pas d’une politique de sécurité établie dans ce domaine.</i></p>
             @else
-                <h5 style="margin-left: 25px">4.{{ $measure->id }} - {{$measure->measure['short_name']}} [{{ $measure->actual_level }}]</h5>
+                <h5 style="margin-left: 25px">4.{{ $k+1 }} - {{$measure->measure['short_name']}} [{{ $measure->actual_level }}]</h5>
                 <p>
                     @for ($i = 1; $i < ($measure->actual_level + 1); $i++)
                         {{$measure->measure['level'.$i.'_actual_label']}}<br>
@@ -328,7 +327,7 @@
                 <p style="margin-left: 50px;"><i><u>Statut</u> : Appliqué</i></p><br>
             @endif
         @else
-            <h5 style="margin-left: 25px">4.{{ $measure->id }} - {{$measure->measure['short_name']}} [{{ $measure->expected_level }}]</h5>
+            <h5 style="margin-left: 25px">4.{{ $k+1 }} - {{$measure->measure['short_name']}} [{{ $measure->expected_level }}]</h5>
             <p>
                 @for ($i = 1; $i < ($measure->expected_level + 1); $i++)
                     {{$measure->measure['level'.$i.'_actual_label']}}<br>
@@ -336,27 +335,16 @@
             </p>
                 <p style="margin-left: 50px;"><i><u>Statut</u> : Applicable {{ \Carbon\Carbon::parse($measure->end_date)->format('d/m/Y') }}</i></p><br>
         @endif
+        </div>
     @endforeach
     <div class="page-break"></div>
 
     {{-- Lettre de mission --}}
-    <h3>5	Lettre de mission du référent cybersécurité</h3>
+    <h3>5. Lettre de mission du référent cybersécurité</h3>
     <p>Le référent cybersécurité est la personne désignée par le représentant de {{ $organization['name'] }} comme étant responsable de la démarche d’amélioration de la cybersécurité.</p>
     {{-- Mettre le texte correspondant à la mission  --}}
-    <p>Missions du RSSI mutualisé :</p>
-    <p>{{ $organization['bilan1'] }}</p>
-    <p><b>Mission et activités du référent cybersécurité</b><br/>
-        La mission d’un référent cybersécurité est de suivre et mettre en place les actions relatives au plan de progrès validé.</p>
-    <p>Pour cela, il réalise les activités suivantes en lien avec le RSSI mutualisé de son OPSN :</p>
-    <ol>
-        <li>Participer aux réunions annuelles en présentiel ou distanciel</li>
-        <li>Prendre connaissance et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Utiliser le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec le RSSI mutualisé</li>
-        <li>Suivre et mettre en place les actions relatives au plan de progrès validé</li>
-        <li>Présenter chaque année le <i>Dossier cybersécurité</i> au représentant de la structure</li>
-        <li>Transmettre chaque année le <i>Dossier cybersécurité</i> au DPO ou son référent.</li>
-    </ol>
+    <p><b>Missions du référent cybersécurité :</b></p>
+    <p>{!! $organization['bilan1'] !!}</p>
 
     <p><b>Ressources annuelles recommandées</b><br/>
         Le référent cybersécurité dispose au moins de 10 jours alloués annuellement.</p>
@@ -364,18 +352,9 @@
 
     <h3>6.	Responsabilités du RSSI mutualisé</h3>
     <p>Le RSSI mutualisé est le dispositif mis en œuvre par votre OPSN pour vous assister dans la démarche d’amélioration de votre cybersécurité.</p>
-    <p>Missions du RSSI mutualisé (Paragraphe 2) :</p>
-    <p>{{ $organization['bilan2'] }}</p>
-    <p><b>Missions du RSSI mutualisé</b></p>
-    <ol>
-        <li>Organiser et animer les réunions annuelles en présentiel ou distanciel</li>
-        <li>Concevoir et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Concevoir et maintenir le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec les Référents Sécurité</li>
-        <li>Alerter les référents sécurité</li>
-        <li>Mettre à jour la base de connaissance du logiciel <i>Madis cyber</i></li>
-        <li>Envoyer une lettre d’information trimestrielle</li>
-    </ol>
+
+    <p><b>Missions du RSSI mutualisé :</b></p>
+    <p>{!! $organization['bilan2'] !!}</p>
     <br>
     <div class="page-break"></div>
 
@@ -448,6 +427,32 @@
     <br>
     <p>En synthèse, les mesures de sécurité opérationnelles dans la collectivité sont les suivantes :</p>
 
+    <table style="width:100%;border:none">
+        <?php $size = 80; ?>
+        @foreach($evaluation->measureLevels as $action)
+            <tr>
+                <td>
+                    <table style="page-break-inside: avoid;width:100%;border: 1px solid #4281A4;border-collapse: collapse">
+                        <tr>
+                            <td style="padding: 0 20px;border: 1px solid #4281A4;width:80%">
+                                <b>{{$action->measure->short_name}}</b>
+                            </td>
+                            <td style="padding: 0 20px;border: 1px solid #4281A4;width:20%">
+                                @include('pdf.dossierCyberSecurite.measure_circle')
+                            </td>
+                        </tr>
+                        <tr>
+                            <td colspan="2" style="padding: 10px 20px;border: 1px solid #4281A4;">
+                                {{$action->measure->name}}
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+
+        @endforeach
+    </table>
+
     <div class="page-break"></div>
 
     <h3>Annexe 3 – Métriques</h3>
@@ -493,16 +498,21 @@
     <div class="page-break"></div>
 
     <h3>Annexe 4 – Glossaire</h3>
-    <br>
-        <p><b>cybersécurité</b></p>
-        <p><b>cyberespace</b></p>
-        <p><b>cybermenace</b></p>
-        <p><b>CMT</b></p>
-        <p><b>Demande de rançon</b></p>
-        <p><b>Vol et recel de données</b></p>
-        <p><b>Fraude au président</b></p>
-        <p><b>Détournement de la téléphonie</b></p>
-        <p><b>Défacement du site internet</b></p>
+    <p><b>Danger</b><br>
+    Elément, personne, groupe de personne ou organisation susceptible d’engendrer un risque (assimilé au terme « source de risque » de la méthode EBIOS RM).
+    </p>
+    <p><b>Cyberespace</b><br>
+    Espace de communication constitué par l’interconnexion mondiale d’équipements de traitement automatisé de données numériques. (ANSSI)
+    </p><p><b>Cybersécurité</b><br>
+    État recherché pour un système d’information lui permettant de résister à des événements issus du cyberespace susceptibles de compromettre la disponibilité, l’intégrité ou la confidentialité des données stockées, traitées ou transmises et des services connexes que ces systèmes offrent ou qu’ils rendent accessibles. La cybersécurité fait appel à des techniques de sécurité des systèmes d’information et s’appuie sur la lutte contre la cybercriminalité et sur la mise en place d’une cyberdéfense. (ANSSI)
+    </p><p><b>Risque</b><br>
+    Danger ou péril dans lequel l’idée de hasard est accusée mais avec la perspective d’un quelconque avantage possible (dictionnaire de la langue philosophique)
+    Un risque est associé à la possibilité qu’un danger connu exploite un scénario d’attaque connu sur un composant et nuise à l’organisme (Inspiré de la norme ISO 27000).
+    </p><p><b>Risque cyber</b><br>
+    Risque portant sur le système d’information ayant pour origine le cyberespace.
+    </p><p><b>Système d’Information</b><br>
+    Ensemble des ressources destinées à collecter, classifier, stocker, gérer, diffuser les informations au sein d’une organisation.
+    </p>
 
 </div>
 @include('pdf.dossierCyberSecurite.graphs-js')
diff --git a/resources/views/pdf/dossierCyberSecurite/graphs-js.blade.php b/resources/views/pdf/dossierCyberSecurite/graphs-js.blade.php
index 9a8f7f99be5fe64c2dd2ec9c09d91d6b37960036..667897c12e268c8524db38599542f5bfebc3eb49 100644
--- a/resources/views/pdf/dossierCyberSecurite/graphs-js.blade.php
+++ b/resources/views/pdf/dossierCyberSecurite/graphs-js.blade.php
@@ -3,9 +3,20 @@
     const measuresData = {!! json_encode($measuresData) !!};
     const attackData = {!! json_encode($attackData) !!};
     const expositionData = {!! json_encode($expositionData) !!};
+
+    expositionData.labels = expositionData.labels.map(function(l) {
+        return l.match(/.{1,40}(\s|$)/g)
+    })
+
     const maturityData = {!! json_encode($maturityData) !!};
     const risksData = {!! json_encode($risksData) !!};
+    risksData.labels = risksData.labels.map(function(l) {
+        return l.match(/.{1,40}(\s|$)/g)
+    })
     const futureRisksData = {!! json_encode($futureRisksData) !!};
+    futureRisksData.labels = futureRisksData.labels.map(function(l) {
+        return l.match(/.{1,40}(\s|$)/g)
+    })
 
     const radarOptions = {
         animation: false,
@@ -32,8 +43,10 @@
                 backdropColor: 'rgba(255,255,255, 0.8)',
                 fontSize: 25,
                 z: 10,
-                min:0,
-                beginAtZero: true,
+                min:-1,
+                max: 3,
+                beginAtZero: false,
+                stepSize: 1,
             },
             grid: {
                 z: 9,
@@ -72,6 +85,7 @@
                 animate: false,
                 ticks: {
                     min: 0,
+                    max: 100,
                     color: '#000',
                     backdropColor: 'rgba(255,255,255, 0.8)',
                     fontSize: 25,
@@ -86,10 +100,30 @@
 
     window.onload=function() {
         // Chart.defaults.global.defaultFontSize = 20;
+        const maturityctx = document.getElementById('maturityGraph').getContext('2d');
+        const maturityChart = new Chart(maturityctx, {
+            type: 'radar',
+            data: {
+                labels: maturityData.labels,
+                datasets: [{
+                    label: '',
+                    data: maturityData.data,
+                    backgroundColor: 'rgba(66,129,164,0.6)',
+                    borderColor: '#4281A4',
+                    pointBackgroundColor: '#4281A4',
+                    pointBorderColor: '#fff',
+                    pointHoverBackgroundColor: '#fff',
+                    pointHoverBorderColor: '#4281A4',
+                    pointRadius: 0,
+                }]
+            },
+            options: radarOptions,
+        });
+
         const ctx = document.getElementById('measuresGraph').getContext('2d');
         const measureOptions = radarOptions;
 
-        measureOptions.scales.yAxes[0].ticks.max = 3
+        measureOptions.scale.ticks.max = 3
         const measuresChart = new Chart(ctx, {
             type: 'radar',
             data: {
@@ -97,7 +131,7 @@
                 datasets: [{
                     label: 'Mesures',
                     data: measuresData.data,
-                    backgroundColor: '#4281A4',
+                    backgroundColor: 'rgba(66,129,164,0.6)',
                     borderColor: '#4281A4',
                     pointBackgroundColor: '#4281A4',
                     pointBorderColor: '#fff',
@@ -110,10 +144,15 @@
         });
 
         const polarOptions = radarOptions;
+        polarOptions.scale.ticks.max = 100
+        polarOptions.scale.ticks.stepSize = 10
 
         polarOptions.startAngle = -125*Math.PI/180
 
         const attackctx = document.getElementById('attackGraph').getContext('2d');
+        // const colors = attackData.labels.map((c, i) => {
+        //     return 'hsla('+ 360*i/attackData.labels.length +', 100%, 60%, 0.6)'
+        // })
         const attackChart = new Chart(attackctx, {
             type: 'polarArea',
             data: {
@@ -121,47 +160,13 @@
                 datasets: [{
                     label: '',
                     data: attackData.data,
-                    backgroundColor: [
-                        'rgba(255, 99, 132, 0.5)', // rouge
-                        'rgba(243, 156, 18, 0.5)', // orange
-                        'rgba(75, 192, 192, 0.5)', // vert
-                        'rgba(255, 221, 86, 0.5)', // jaune
-                        'rgba(54, 162, 235, 0.5)', // bleu
-                        'rgba(255, 99, 132, 0.5)', // rouge
-                        'rgba(243, 156, 18, 0.5)', // orange
-                        'rgba(75, 192, 192, 0.5)', // vert
-                        'rgba(255, 221, 86, 0.5)', // jaune
-                        'rgba(54, 162, 235, 0.5)', // bleu
-                        'rgba(255, 99, 132, 0.5)', // rouge
-                        'rgba(243, 156, 18, 0.5)', // orange
-                        'rgba(75, 192, 192, 0.5)', // vert
-                        'rgba(255, 221, 86, 0.5)', // jaune
-                        'rgba(54, 162, 235, 0.5)', // bleu
-                    ].slice(0, attackData.data.length)
+                    backgroundColor: {!!json_encode($attackColors)!!}
                 }]
             },
             options: polarOptions,
         });
 
-        const maturityctx = document.getElementById('maturityGraph').getContext('2d');
-        const maturityChart = new Chart(maturityctx, {
-            type: 'radar',
-            data: {
-                labels: maturityData.labels,
-                datasets: [{
-                    label: '',
-                    data: maturityData.data,
-                    backgroundColor: '#4281A4',
-                    borderColor: '#4281A4',
-                    pointBackgroundColor: '#4281A4',
-                    pointBorderColor: '#fff',
-                    pointHoverBackgroundColor: '#fff',
-                    pointHoverBorderColor: '#4281A4',
-                    pointRadius: 0,
-                }]
-            },
-            options: radarOptions,
-        });
+
 
         const expoctx = document.getElementById('expositionGraph').getContext('2d');
         const expoChart = new Chart(expoctx, {
diff --git a/resources/views/pdf/dossierCyberSecurite/measure_circle.blade.php b/resources/views/pdf/dossierCyberSecurite/measure_circle.blade.php
index 66c6f89c38ebebee63433970279f2c5d5e7ebd79..c810d161311393691b0db1e11e01aeff5dbde915 100644
--- a/resources/views/pdf/dossierCyberSecurite/measure_circle.blade.php
+++ b/resources/views/pdf/dossierCyberSecurite/measure_circle.blade.php
@@ -1,70 +1,76 @@
 <?php
 if (!function_exists('getProgressFromLevel')) {
-function getProgressFromLevel ($level)
-{
-    return match ($level) {
-        0 => 15,
-        1 => 33,
-        2 => 66,
-        3 => 100,
-        default => 0,
-    };
-}
+    function getProgressFromLevel($level)
+    {
+        return match ($level) {
+            0 => 15,
+            1 => 33,
+            2 => 66,
+            3 => 100,
+            default => 0,
+        };
+    }
 }
 $actualColor = 'transparent';
 switch ($action->actual_level) {
     case 0:
-        $actualColor = 'black';
+        $actualColor = '#454545';
         break;
     case 1:
-        $actualColor =  'red';
+        $actualColor = '#D63F49';
         break;
     case 2:
-        $actualColor =  '#4281A4';
+        $actualColor = '#FFC107';
         break;
     case 3:
-        $actualColor = 'green';
+        $actualColor = '#468355';
         break;
 }
 $expectedColor = 'transparent';
 switch ($action->expected_level) {
     case 0:
-        $expectedColor = 'black';
+        $expectedColor = '#454545';
         break;
     case 1:
-        $expectedColor =  'red';
+        $expectedColor = '#D63F49';
         break;
     case 2:
-        $expectedColor =  '#4281A4';
+        $expectedColor = '#FFC107';
         break;
     case 3:
-        $expectedColor = 'green';
+        $expectedColor = '#468355';
         break;
 }
 $expectedDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->expected_level), 100))->dashArray();
-$actualDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->actual_level), 100))->dashArray();;
+$actualDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->actual_level), 100))->dashArray();
+$svgSize = isset($size) ? $size : 150;
+$globalSize = isset($size) ? $size + $size / 8 : 190;
 ?>
 
 
 
-<div style="height: 180px;position:relative">
+<div style="height: {{$globalSize}}px;position:relative">
     <p style="text-align: center;z-index: 1;position: absolute;top: 25%;left: 0;right: 0;" class="@if($action->actual_level === 3) custom-crown @endif">
         @if ($action->actual_level === 3)
             <i class="fas fa-crown"></i>
         @endif
+        @if($svgSize >= 150)
         <span class="@if($action->actual_level === 3) text-white @else text-muted @endif text-uppercase small">Niveau</span>  <br/>
-        <span class="h1">{{$action->actual_level}}</span>
+        @endif
+        <span class="h1" @if($svgSize < 150) style="margin: 0; padding: 0;line-height:1.8em;font-size: 1.8em" @endif>
+            {{$action->actual_level}}
+        </span>
     </p>
     @if($action->actual_level === 3)
 {{--        Show crown for level 3--}}
         <div style="position: relative">
-            <svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" fill="green" viewBox="0 0 16 16">
+            <svg xmlns="http://www.w3.org/2000/svg" width="{{$svgSize}}" height="{{$svgSize}}" fill="#468355" viewBox="0 0 16 16">
                 <path d="m8 1.288 6.842 5.56L12.267 15H3.733L1.158 6.847 8 1.288zM16 6.5 8 0 0 6.5 3 16h10l3-9.5z"/>
             </svg>
 
             <svg
-                xmlns="http://www.w3.org/2000/svg" width="110"
-                height="110" fill="green"
+                xmlns="http://www.w3.org/2000/svg" width="{{$svgSize-40}}"
+                height="{{$svgSize-40}}" fill="#468355"
                 viewBox="0 0 16 16"
                 style="top: 23px">
                 <path d="m8 0 8 6.5-3 9.5H3L0 6.5 8 0z"/>
@@ -72,16 +78,16 @@ function getProgressFromLevel ($level)
         </div>
     @else
 {{--        Show circle for other levels--}}
-        <div style="position: relative;width:160px;height:160px;margin: 0 auto;">
+        <div style="position: relative;width:{{$svgSize+10}}px;height:{{$svgSize+10}}px;margin: 0 auto;">
             <!-- BASE CIRCLE -->
-            <svg data-v-4d45322b="" height="160" width="160">
+            <svg data-v-4d45322b="" height="{{$svgSize+10}}" width="{{$svgSize+10}}">
                 <circle data-v-4d45322b="" stroke="lightgray" stroke-dasharray="414.6902302738527 414.6902302738527"
-                        stroke-width="7" fill="transparent" r="66" cx="80" cy="80" style="stroke-dashoffset: 0px;"></circle>
+                        stroke-width="7" fill="transparent" r="{{($svgSize-18) / 2}}" cx="{{($svgSize+10) / 2}}" cy="{{($svgSize+10) / 2}}" style="stroke-dashoffset: 0px;"></circle>
             </svg>
         <!-- ACTUAL LEVEL -->
             <svg
-                height="160"
-                width="160"
+                height="{{$svgSize+10}}"
+                width="{{$svgSize+10}}"
             >
                 <circle
                     stroke="{{$actualColor}}"
@@ -89,9 +95,9 @@ function getProgressFromLevel ($level)
 {{--                    style="stroke-dashoffset: {{$actualDashOffset}};"--}}
                     stroke-width="7"
                     fill="transparent"
-                    r="66"
-                    cx="80"
-                    cy="80"
+                    r="{{($svgSize-18) / 2}}"
+                    cx="{{($svgSize+10) / 2}}"
+                    cy="{{($svgSize+10) / 2}}"
                 />
             </svg>
         </div>
diff --git a/resources/views/pdf/planAction/cover.blade.php b/resources/views/pdf/planAction/cover.blade.php
index bcd50de2781e09ef34720f0cf974f8d69bd14d5e..70b24e0774664be3f11a853291be5784c49c6a27 100644
--- a/resources/views/pdf/planAction/cover.blade.php
+++ b/resources/views/pdf/planAction/cover.blade.php
@@ -29,8 +29,9 @@
     </div>
 
     <h3 style="text-align:center;margin-top: 50px;margin-left: 3%;">Plan d’action - {{ $date }}</h3>
-    <p style="margin-left: 160px;margin-top:20%">Référent élu : {{ $elu }}</p>
-    <p style="margin-left: 160px">Référent agent : {{ $agent }}</p>
+<p style="margin-left: 160px;margin-top:20%">Responsable de l'organisation : {{ $organization->referent->firstname }} {{ $organization->referent->lastname }}</p>
+<p style="margin-left: 160px;">Responsable cybersécurité : {{ $organization->referentCyber->firstname }} {{ $organization->referentCyber->lastname }}</p>
+<p style="margin-left: 160px;">Responsable élu cybersécurité : {{ $organization->referentElu->firstname }} {{ $organization->referentElu->lastname }}</p>
     <p style="margin-left: 160px">Version du référentiel :  {{ $referentiel }}</p>
 </body>
 </html>
diff --git a/resources/views/pdf/planAction/header.blade.php b/resources/views/pdf/planAction/header.blade.php
index 774e711a38cbcc12921c8ed924fbc1e451f25349..bc1e0df6746b84883f34fd337521a8ae6e0ab758 100644
--- a/resources/views/pdf/planAction/header.blade.php
+++ b/resources/views/pdf/planAction/header.blade.php
@@ -42,7 +42,7 @@ function substitute(name) {
 </style>
 <body onload="substitutePdfVariables()">
 <header>
-    <p style="margin-bottom: 0px">Dossier cybersécurité - {{ $organization['name'] }} {{ $evaluation->updated_at->format('d/m/Y') }}</p>
+    <p style="margin-bottom: 0px">Plan d'action - {{ $organization['name'] }} {{ $evaluation->updated_at->format('d/m/Y') }}</p>
     <hr>
 </header>
 <div style="height: 25px"></div>
diff --git a/resources/views/pdf/planAction/measure_circle.blade.php b/resources/views/pdf/planAction/measure_circle.blade.php
index 2965d708ac0f1e2c7dad2b46a3c0c608c3de34b5..7955afecabfa375ec60dddf89f7c5b87c0f149b4 100644
--- a/resources/views/pdf/planAction/measure_circle.blade.php
+++ b/resources/views/pdf/planAction/measure_circle.blade.php
@@ -1,48 +1,48 @@
 <?php
 if (!function_exists('getProgressFromLevel')) {
-function getProgressFromLevel ($level)
-{
-    return match ($level) {
-        0 => 15,
-        1 => 33,
-        2 => 66,
-        3 => 100,
-        default => 0,
-    };
-}
+    function getProgressFromLevel($level)
+    {
+        return match ($level) {
+            0 => 15,
+            1 => 33,
+            2 => 66,
+            3 => 100,
+            default => 0,
+        };
+    }
 }
 $actualColor = 'transparent';
 switch ($action->actual_level) {
     case 0:
-        $actualColor = 'black';
+        $actualColor = '#454545';
         break;
     case 1:
-        $actualColor =  'red';
+        $actualColor = '#D63F49';
         break;
     case 2:
-        $actualColor =  '#4281A4';
+        $actualColor = '#FFC107';
         break;
     case 3:
-        $actualColor = 'green';
+        $actualColor = '#468355';
         break;
 }
 $expectedColor = 'transparent';
 switch ($action->expected_level) {
     case 0:
-        $expectedColor = 'black';
+        $expectedColor = '#454545';
         break;
     case 1:
-        $expectedColor =  'red';
+        $expectedColor = '#D63F49';
         break;
     case 2:
-        $expectedColor =  '#4281A4';
+        $expectedColor = '#FFC107';
         break;
     case 3:
-        $expectedColor = 'green';
+        $expectedColor = '#468355';
         break;
 }
 $expectedDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->expected_level), 100))->dashArray();
-$actualDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->actual_level), 100))->dashArray();;
+$actualDashOffset = (new \App\Helpers\SVG(getProgressFromLevel($action->actual_level), 100))->dashArray();
 ?>
 
 
@@ -65,13 +65,13 @@ function getProgressFromLevel ($level)
     @if($action->actual_level === 3)
 {{--        Show crown for level 3--}}
         <div style="position: relative">
-            <svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" fill="green" viewBox="0 0 16 16">
+            <svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" fill="#468355" viewBox="0 0 16 16">
                 <path d="m8 1.288 6.842 5.56L12.267 15H3.733L1.158 6.847 8 1.288zM16 6.5 8 0 0 6.5 3 16h10l3-9.5z"/>
             </svg>
 
             <svg
                 xmlns="http://www.w3.org/2000/svg" width="110"
-                height="110" fill="green"
+                height="110" fill="#468355"
                 viewBox="0 0 16 16"
                 style="top: 23px">
                 <path d="m8 0 8 6.5-3 9.5H3L0 6.5 8 0z"/>
diff --git a/resources/views/pdf/planAction/planAction.blade.php b/resources/views/pdf/planAction/planAction.blade.php
index 406fe9633631491471bcbc0202c0e0fc6ae20882..62940a1ec99072740d085399ecde95949d493b7d 100644
--- a/resources/views/pdf/planAction/planAction.blade.php
+++ b/resources/views/pdf/planAction/planAction.blade.php
@@ -14,6 +14,7 @@
             padding: 1em;
             font-family: sans-serif;
             line-height: 1.4em;
+            text-align: justify;
         }
         .table_actions {
             border-left: 0.01em solid #ccc;
@@ -86,10 +87,10 @@
     <div style="height: 3em;"></div>
     {{-- Préambule --}}
     <h3>1. Préambule</h3>
-    <p>A travers de la méthode CMT (cybersécurité Mutualisée des Territoires) avec le logiciel <i>Madis cyber</i> proposé par OPSN, {{ $organization['name'] }} a réalisé une analyse des risques cyber puis s’est dotée d’un plan d’action visant à réduire l’exposition aux risques cyber.<br/><br/>
-        L’ensemble de la démarche que s’engage à réaliser {{ $organization['name'] }} est consolidé dans un document intitulé <i>Dossier cybersécurité</i> dans lequel apparaît le plan d’action issu de l’analyse des risques.<br/><br/>
-        Le présent document décrit le plan d’action présenté dans le <i>Dossier cybersécurité</i>.<br/><br/>
-        Ce plan d’action est produit par le logiciel <i>Madis cyber</i>.
+    <p>À travers la méthode CMT (cybersécurité Mutualisée des Territoires) avec le logiciel&nbsp;<i>&nbsp;Madis cyber</i> proposé par OPSN, {{ $organization['name'] }} a réalisé une analyse des risques cyber puis s’est dotée d’un plan d’action visant à réduire l’exposition aux risques cyber.<br/><br/>
+        L’ensemble de la démarche que s’engage à réaliser {{ $organization['name'] }} est consolidé dans un document intitulé&nbsp;<i>&nbsp;Dossier cybersécurité</i> dans lequel apparaît le plan d’action issu de l’analyse des risques.<br/><br/>
+        Le présent document décrit le plan d’action présenté dans le&nbsp;<i>&nbsp;Dossier cybersécurité</i>.<br/><br/>
+        Ce plan d’action est produit par le logiciel&nbsp;<i>&nbsp;Madis cyber</i>.
     </p>
     <div class="page-break"></div>
 
@@ -222,7 +223,7 @@
                             </div>
                         </td>
                         <td style="font-size: 0.8em;width:50%;border:none;"><p style="text-decoration: underline;">Description :</p>
-                            <p style="margin-right: 35px">{{$action->measure['level'.$action->expected_level.'_description']}}</p>
+                            <p style="margin-right: 35px">{!!$action->measure['level'.$action->expected_level.'_description']!!}</p>
                             <p style="text-decoration: underline;">Préconisation :</p>
                             <p style="margin-right: 35px">{{$action->measure['level'.$action->expected_level.'_preconized_label']}}</p>
                         </td>
@@ -239,20 +240,8 @@
     <h3>3.	Lettre de mission du référent cybersécurité</h3>
     <p>Le référent cybersécurité est la personne désignée par le représentant de {{ $organization['name'] }} comme étant responsable de la démarche d’amélioration de la cybersécurité.</p>
     {{-- Mettre le texte correspondant à la mission  --}}
-    <p>Missions du RSSI mutualisé :</p>
-    <p>{{ $organization['bilan1'] }}</p>
-    <p><b>Mission et activités du référent cybersécurité</b><br/>
-        La mission d’un référent cybersécurité est de suivre et mettre en place les actions relatives au plan de progrès validé.</p>
-    <p>Pour cela, il réalise les activités suivantes en lien avec le RSSI mutualisé de son OPSN :</p>
-    <ol>
-        <li>Participer aux réunions annuelles en présentiel ou distanciel</li>
-        <li>Prendre connaissance et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Utiliser le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec le RSSI mutualisé</li>
-        <li>Suivre et mettre en place les actions relatives au plan de progrès validé</li>
-        <li>Présenter chaque année le <i>Dossier cybersécurité</i> au représentant de la structure</li>
-        <li>Transmettre chaque année le <i>Dossier cybersécurité</i> au DPO ou son référent.</li>
-    </ol>
+    <p><b>Missions du référent cybersécurité :</b></p>
+    <p>{!! $organization['bilan1'] !!}</p>
 
     <p><b>Ressources annuelles recommandées</b><br/>
         Le référent cybersécurité dispose au moins de 10 jours alloués annuellement.</p>
@@ -261,18 +250,8 @@
 
     <h3>4.	Responsabilités du RSSI mutualisé</h3>
     <p>Le RSSI mutualisé est le dispositif mis en œuvre par votre OPSN pour vous assister dans la démarche d’amélioration de votre cybersécurité.</p>
-    <p>Missions du RSSI mutualisé (Paragraphe 2) :</p>
-    <p>{{ $organization['bilan2'] }}</p>
-    <p><b>Missions du RSSI mutualisé</b></p>
-    <ol>
-        <li>Organiser et animer les réunions annuelles en présentiel ou distanciel</li>
-        <li>Concevoir et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Concevoir et maintenir le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec les Référents Sécurité</li>
-        <li>Alerter les référents sécurité</li>
-        <li>Mettre à jour la base de connaissance du logiciel <i>Madis cyber</i></li>
-        <li>Envoyer une lettre d’information trimestrielle</li>
-    </ol>
+    <p><b>Missions du RSSI mutualisé :</b></p>
+    <p>{!! $organization['bilan2'] !!}</p>
     <br>
 
     <h3>5.	Annexe 1 : Fiches pratiques</h3>
diff --git a/resources/views/pdf/politiqueSecurite/cover.blade.php b/resources/views/pdf/politiqueSecurite/cover.blade.php
index aeb63a7904021fcf42466cf39c344a7ffe014fe7..36b75e8c2d2a891b638ea4a4da0f23685a0bb3c1 100644
--- a/resources/views/pdf/politiqueSecurite/cover.blade.php
+++ b/resources/views/pdf/politiqueSecurite/cover.blade.php
@@ -29,8 +29,10 @@
     </div>
 
     <h3 style="text-align:center;margin-top: 50px;margin-left: 3%;">Politique de sécurité - {{ $date }}</h3>
-    <p style="margin-left: 160px;margin-top:20%">Référent élu : {{ $elu }}</p>
-    <p style="margin-left: 160px">Référent agent : {{ $agent }}</p>
-    <p style="margin-left: 160px">Version du référentiel :  {{ $referentiel }}</p>
+<p style="margin-left: 160px;margin-top:20%">Responsable de l'organisation : {{ $organization->referent->firstname }} {{ $organization->referent->lastname }}</p>
+<p style="margin-left: 160px;">Responsable cybersécurité : {{ $organization->referentCyber->firstname }} {{ $organization->referentCyber->lastname }}</p>
+<p style="margin-left: 160px;">Responsable élu cybersécurité : {{ $organization->referentElu->firstname }} {{ $organization->referentElu->lastname }}</p>
+
+<p style="margin-left: 160px">Version du référentiel :  {{ $referentiel }}</p>
 </body>
 </html>
diff --git a/resources/views/pdf/politiqueSecurite/header.blade.php b/resources/views/pdf/politiqueSecurite/header.blade.php
index 774e711a38cbcc12921c8ed924fbc1e451f25349..c6b47fe77525569e320422165e08047ef8bb40b2 100644
--- a/resources/views/pdf/politiqueSecurite/header.blade.php
+++ b/resources/views/pdf/politiqueSecurite/header.blade.php
@@ -42,7 +42,7 @@ function substitute(name) {
 </style>
 <body onload="substitutePdfVariables()">
 <header>
-    <p style="margin-bottom: 0px">Dossier cybersécurité - {{ $organization['name'] }} {{ $evaluation->updated_at->format('d/m/Y') }}</p>
+    <p style="margin-bottom: 0px">Politique de cybersécurité - {{ $organization['name'] }} {{ $evaluation->updated_at->format('d/m/Y') }}</p>
     <hr>
 </header>
 <div style="height: 25px"></div>
diff --git a/resources/views/pdf/politiqueSecurite/politique.blade.php b/resources/views/pdf/politiqueSecurite/politique.blade.php
index a1fc56e92e5a1f53b2ea334900e15f79b55670b9..86adf04f6f32c4d5451f7208ac69ce0fe10a4ab6 100644
--- a/resources/views/pdf/politiqueSecurite/politique.blade.php
+++ b/resources/views/pdf/politiqueSecurite/politique.blade.php
@@ -12,6 +12,7 @@
     <style>
         body {
             padding: 4em;
+            text-align: justify;
         }
         .table_actions {
             border-left: 0.01em solid #ccc;
@@ -83,9 +84,9 @@
 <div class="WordSection1">
     {{-- Préambule --}}
     <h3>1. Préambule</h3><br>
-    <p>Au travers de la méthode CMT (cybersécurité Mutualisée des Territoires) avec le logiciel    <i>Madis cyber</i> proposé par OPSN, {{ $organization['name'] }} a réalisé une analyse des risques cyber puis s’est dotée d’un plan d’action visant à réduire l’exposition aux risques cyber.<br/><br/>
-        L’ensemble de la démarche est synthétisé dans un document intitulé <i>Dossier cybersécurité</i>. Dans ce dossier, une politique de sécurité est aussi proposée à {{ $organization['name'] }}.<br/><br/>
-        Le présent document fait partie du <i>Dossier cybersécurité</i> et décrit la politique de sécurité cyber que {{ $organization['name'] }} souhaite appliquer.<br/><br/>
+    <p>Au travers de la méthode CMT (cybersécurité Mutualisée des Territoires) avec le logiciel&nbsp;<i>&nbsp;Madis cyber</i> proposé par OPSN, {{ $organization['name'] }} a réalisé une analyse des risques cyber puis s’est dotée d’un plan d’action visant à réduire l’exposition aux risques cyber.<br/><br/>
+        L’ensemble de la démarche est synthétisé dans un document intitulé&nbsp;<i>&nbsp;Dossier cybersécurité</i>. Dans ce dossier, une politique de sécurité est aussi proposée à {{ $organization['name'] }}.<br/><br/>
+        Le présent document fait partie du&nbsp;<i>&nbsp;Dossier cybersécurité</i> et décrit la politique de sécurité cyber que {{ $organization['name'] }} souhaite appliquer.<br/><br/>
         La politique de sécurité comprend deux types de mesures :</p>
     <p style="margin-left: 25px;">
         •	Statut appliqué : les mesures sont déjà en place;<br>
@@ -93,23 +94,23 @@
     </p>
     <p>
         Cette politique peut être transmise aux prestataires afin qu’ils s’engagent à respecter au moins les mêmes mesures pour ne pas dégrader le niveau de sécurité de {{ $organization['name'] }}.<br><br>
-        Cette politique est produit par le logiciel <i>Madis cyber</i>.
+        Cette politique est produit par le logiciel&nbsp;<i>&nbsp;Madis cyber</i>.
     </p>
     <div class="page-break"></div>
 
     {{-- 2.	Politique de cybersécurité --}}
     <h3>2. Politique de cybersécurité</h3>
     <p>La politique de sécurité permet de visualiser quelles sont les mesures de sécurité mises en œuvre au sein de {{ $organization['name'] }}.</p>
-    @foreach ($evaluation->measureLevels as $measure)
-        @if($measure->id ===6)
-            <div class="page-break"></div>
-        @endif
-        @if ($measure->expected_level === null)
-            @if($measure->actual_level === 0 )
-                <p><i>La collectivité ne dispose pas d’une politique de sécurité établie dans ce domaine.</i></p>
-            @else
-                <h5 style="margin-left: 25px">2.{{ $measure->id }} - {{$measure->measure['short_name']}} [{{ $measure->actual_level }}]</h5>
-                <p>
+    @foreach ($evaluation->measureLevels as $k => $measure)
+        <div style="page-break-inside: avoid">
+        @if ($measure->expected_level === null || $measure->expected_level === 0)
+                @if($measure->actual_level === 0 )
+                    <h5 style="margin-left: 25px">2.{{ $k+1 }} - {{$measure->measure['short_name']}}</h5>
+
+                    <p><i>La collectivité ne dispose pas d’une politique de sécurité établie dans ce domaine.</i></p>
+                @else
+                    <h5 style="margin-left: 25px">2.{{ $k+1 }} - {{$measure->measure['short_name']}} [{{ $measure->actual_level }}]</h5>
+                    <p>
                     @for ($i = 1; $i < ($measure->actual_level + 1); $i++)
                         {{$measure->measure['level'.$i.'_actual_label']}}<br>
                     @endfor
@@ -117,7 +118,7 @@
                 <p style="margin-left: 50px;"><i><u>Statut</u> : Appliqué</i></p><br>
             @endif
         @else
-            <h5 style="margin-left: 25px">2.{{ $measure->id }} - {{$measure->measure['short_name']}} [{{ $measure->expected_level }}]</h5>
+            <h5 style="margin-left: 25px">2.{{ $k+1 }} - {{$measure->measure['short_name']}} [{{ $measure->expected_level }}]</h5>
             <p>
                 @for ($i = 1; $i < ($measure->expected_level + 1); $i++)
                     {{$measure->measure['level'.$i.'_actual_label']}}<br>
@@ -125,6 +126,7 @@
             </p>
                 <p style="margin-left: 50px;"><i><u>Statut</u> : Applicable {{ \Carbon\Carbon::parse($measure->end_date)->format('d/m/Y') }}</i></p><br>
         @endif
+        </div>
     @endforeach
     <div class="page-break"></div>
 
@@ -132,20 +134,8 @@
     <h3>3.	Lettre de mission du référent cybersécurité</h3>
     <p>Le référent cybersécurité est la personne désignée par le représentant de {{ $organization['name'] }} comme étant responsable de la démarche d’amélioration de la cybersécurité.</p>
     {{-- Mettre le texte correspondant à la mission  --}}
-    <p>Missions du RSSI mutualisé :</p>
-    <p>{{ $organization['bilan1'] }}</p>
-    <p><b>Mission et activités du référent cybersécurité</b><br/>
-        La mission d’un référent cybersécurité est de suivre et mettre en place les actions relatives au plan de progrès validé.</p>
-    <p>Pour cela, il réalise les activités suivantes en lien avec le RSSI mutualisé de son OPSN :</p>
-    <ol>
-        <li>Participer aux réunions annuelles en présentiel ou distanciel</li>
-        <li>Prendre connaissance et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Utiliser le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec le RSSI mutualisé</li>
-        <li>Suivre et mettre en place les actions relatives au plan de progrès validé</li>
-        <li>Présenter chaque année le <i>Dossier cybersécurité</i> au représentant de la structure</li>
-        <li>Transmettre chaque année le <i>Dossier cybersécurité</i> au DPO ou son référent.</li>
-    </ol>
+    <p><b>Missions du référent cybersécurité :</b></p>
+    <p>{!! $organization['bilan1'] !!}</p>
 
     <p><b>Ressources annuelles recommandées</b><br/>
         Le référent cybersécurité dispose au moins de 10 jours alloués annuellement.</p>
@@ -154,18 +144,8 @@
 
     <h3>4.	Responsabilités du RSSI mutualisé</h3>
     <p>Le RSSI mutualisé est le dispositif mis en œuvre par votre OPSN pour vous assister dans la démarche d’amélioration de votre cybersécurité.</p>
-    <p>Missions du RSSI mutualisé (Paragraphe 2) :</p>
-    <p>{{ $organization['bilan2'] }}</p>
-    <p><b>Missions du RSSI mutualisé</b></p>
-    <ol>
-        <li>Organiser et animer les réunions annuelles en présentiel ou distanciel</li>
-        <li>Concevoir et diffuser des supports pédagogiques (vidéos, fiches pratiques, etc.)</li>
-        <li>Concevoir et maintenir le logiciel <i>Madis cyber</i></li>
-        <li>Collaborer avec les Référents Sécurité</li>
-        <li>Alerter les référents sécurité</li>
-        <li>Mettre à jour la base de connaissance du logiciel <i>Madis cyber</i></li>
-        <li>Envoyer une lettre d’information trimestrielle</li>
-    </ol>
+    <p><b>Missions du RSSI mutualisé :</b></p>
+    <p>{!! $organization['bilan2'] !!}</p>
     <br>
 </div>
 
diff --git a/routes/api.php b/routes/api.php
index 6e068561745856852184a1dc92d2136662b08462..72337cc4e1a57664dc84c9aa44632482500e9360 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -66,8 +66,15 @@
     Route::get('/{id}/graphs/exposition', [GraphDataController::class, 'exposition'])->name('api.evaluations.graph.exposition');
     Route::get('/{id}/graphs/attack', [GraphDataController::class, 'attack'])->name('api.evaluations.graph.attack');
     Route::get('/{id}/graphs/maturity', [GraphDataController::class, 'maturity'])->name('api.evaluations.graph.maturity');
+    Route::get('/{id}/graphs/best_measures', [GraphDataController::class, 'bestMeasures'])->name('api.evaluations.graph.best_measures');
     Route::delete('/{id}', [EvaluationsController::class, 'delete'])->name('api.evaluations.delete');
 });
+
+Route::prefix('/graphs')->middleware('auth:sanctum')->group(function () {
+    Route::get('/actionterritory', [GraphDataController::class, 'actionterritory'])->name('api.evaluations.graph.actionterritory');
+    Route::get('/organizations/{territory_id?}', [GraphDataController::class, 'organizations'])->name('api.evaluations.graph.organizations');
+});
+
 Route::prefix('/dangers')->middleware('auth:sanctum')->group(function () {
     Route::get('/', [DangersController::class, 'all'])->name('api.dangers.all');
 });
diff --git a/routes/web.php b/routes/web.php
index dc3e2d52e9d119268c3ca79fad3bc61bf408ef79..4bee61f4a6afc01e317e88ad46b4d1e8a59030fb 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,9 +1,14 @@
 <?php
 
+use App\Http\Controllers\Auth\LoginController;
+use App\Http\Controllers\Auth\LogoutController;
+use App\Http\Controllers\ExportController;
 use App\Http\Controllers\PdfController;
 use App\Http\Controllers\UsersController;
+use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Route;
 
+/*
 /*
 |--------------------------------------------------------------------------
 | Web Routes
@@ -15,19 +20,32 @@
 |
 */
 
-Route::get('/logout', [\App\Http\Controllers\Auth\LogoutController::class, 'logout'])->name('logout');
-Route::post('/login', [\App\Http\Controllers\Auth\LoginController::class, 'login'])->name('login');
+Route::get('/logout', [LogoutController::class, 'logout'])->name('logout');
+Route::post('/login', [LoginController::class, 'login'])->name('login');
 Route::get('/login', function () {
+    if (Auth::user()) {
+        return redirect(route('home'));
+    }
+
     return view('app');
 });
 
 Route::post('/newpassword', [UsersController::class, 'storePassword'])->name('password_reset.send');
 Route::get('/newpassword/{id}/{reset_token}', [UsersController::class, 'createPassword'])->name('password_reset');
 
+Route::middleware('auth:sanctum')->group(function () {
+    Route::prefix('/export')->group(function () {
+        Route::get('/structures.{ext}', [ExportController::class, 'organizations'])
+            ->whereIn('ext', ['csv', 'xlsx', 'json'])->name('export.organizations');
+        Route::get('/evaluations.{ext}', [ExportController::class, 'evaluations'])
+            ->whereIn('ext', ['csv', 'xlsx', 'json'])->name('export.evaluations');
+    });
+});
+
 Route::middleware('auth:sanctum')->prefix('/pdf')->group(function () {
     Route::get('/planAction/{organization_id}', [PdfController::class, 'ActionPlanPdf'])->name('pdf.plan_action');
     Route::get('/politiqueSecurite/{organization_id}', [PdfController::class, 'PolitiqueSecuritePdf'])->name('pdf.politique_securite');
-    Route::get('/dossierCyberSecurite/{organization_id}', [PdfController::class, 'DossierCyberSecuritePdf'])->name('pdf.dossier_cyber_securite');
+    Route::get('/dossierCyberSecurite/{organization_id}/{evaluation_id?}', [PdfController::class, 'DossierCyberSecuritePdf'])->name('pdf.dossier_cyber_securite');
 });
 
 Route::middleware('auth:sanctum')->get('/{any}', function () {
@@ -36,7 +54,7 @@
 
 Route::get('/', function () {
     if (!Auth::user()) {
-        return redirect('/login');
+        return redirect(route('login'));
     }
 
     return view('app');
diff --git a/tests/Feature/EvaluationsControllerTest.php b/tests/Feature/EvaluationsControllerTest.php
index 15fab3e0ce9636793bf313bf9d9749a98297d336..a8924e21415095d5a3299156df9f0b8d56794d66 100644
--- a/tests/Feature/EvaluationsControllerTest.php
+++ b/tests/Feature/EvaluationsControllerTest.php
@@ -6,6 +6,7 @@
 use App\Models\DangerLevel;
 use App\Models\DangerLevelEvaluation;
 use App\Models\Evaluation;
+use App\Models\EvaluationMaturityAnswer;
 use App\Models\MaturityAnswer;
 use App\Models\MaturityQuestion;
 use App\Models\Measure;
@@ -181,6 +182,7 @@ public function testPostDraftEvaluationShouldCreateDraftEvaluation()
             'measure_levels' => [],
             'maturity_levels' => [],
             'reference' => env('REFERENTIEL_VERSION'),
+            'maturity_cyber' => 0,
         ], $data);
 
         $dbEval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])->find($nextId);
@@ -233,12 +235,13 @@ public function testPostNonDraftEvaluationWithDataShouldMoveToStep2()
             'updated_by' => $user->firstname . ' ' . $user->lastname,
             'organization_id' => $user->organization_id,
             'organization' => $user->organization->toArray(),
-            'created_at' => Carbon::now()->setMicroseconds(0)->format('Y-m-d\TH:i:s.u\Z'),
-            'updated_at' => Carbon::now()->setMicroseconds(0)->format('Y-m-d\TH:i:s.u\Z'),
+            'created_at' => $data['created_at'],
+            'updated_at' => $data['updated_at'],
             'danger_levels' => $dangersLevelsEval->toArray(),
             'measure_levels' => [],
             'maturity_levels' => [],
             'reference' => env('REFERENTIEL_VERSION'),
+            'maturity_cyber' => 0,
         ], $data);
 
         $dbEval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])->find($nextId);
@@ -304,6 +307,7 @@ public function testPutDraftEvaluationShouldSaveDraftEvaluation()
             'measure_levels' => [],
             'maturity_levels' => [],
             'reference' => env('REFERENTIEL_VERSION'),
+            'maturity_cyber' => $eval['maturity_cyber'],
         ], $data);
 
         $dbEval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])->find($eval['id']);
@@ -365,6 +369,7 @@ public function testPutDraftEvaluationWithStep2ShouldSaveMeasures()
             'measure_levels' => [$measureLevel->toArray()],
             'maturity_levels' => [],
             'reference' => env('REFERENTIEL_VERSION'),
+            'maturity_cyber' => $eval['maturity_cyber'],
         ], $data);
 
         $dbEval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])->find($eval['id']);
@@ -378,7 +383,7 @@ public function testPutEvaluationShouldSaveEvaluationWithFinishedStep()
     {
         $user = User::where('role', User::ROLE_MANAGER)->first();
 
-        $eval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])
+        $eval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'measureLevels.measure', 'maturityLevels'])
             ->where('organization_id', $user->organization_id)
             ->where('current_step', 5)
             ->where('reference', env('REFERENTIEL_VERSION'))
@@ -397,6 +402,8 @@ public function testPutEvaluationShouldSaveEvaluationWithFinishedStep()
 
         $data = $response->json();
 
+        $newEval = Evaluation::find($eval['id']);
+
         $this->assertEquals([
             'id' => $eval['id'],
             'status' => Evaluation::STATUS_DONE,
@@ -411,6 +418,7 @@ public function testPutEvaluationShouldSaveEvaluationWithFinishedStep()
             'measure_levels' => $eval['measure_levels'],
             'maturity_levels' => $eval['maturity_levels'],
             'reference' => env('REFERENTIEL_VERSION'),
+            'maturity_cyber' => $newEval->maturity_cyber,
         ], $data);
 
         $dbEval = Evaluation::with(['organization', 'dangerLevels', 'measureLevels', 'maturityLevels'])->find($eval['id']);
@@ -514,4 +522,30 @@ public function testAdminCannotUpdateEvaluationIfDifferentReference()
         $response->assertStatus(422);
         $response->assertJson(['message' => 'Le référentiel de cette évaluation ne correspond pas au référentiel actuel']);
     }
+
+    public function testExecutionMaturityLevelWithOneCompletedEvaluationInOrganizationShouldBeZero()
+    {
+        $orgWithSingleEvaluation = Organization::whereHas('evaluations', function ($q) {
+        }, '=', 1)->first();
+
+        $evals = Evaluation::where('status', Evaluation::STATUS_DONE)
+
+            ->where('organization_id', $orgWithSingleEvaluation->id)
+            ->with(['maturityLevels', 'maturityLevels.answer', 'maturityLevels.question'])
+            ->get()
+        ;
+
+        $this->assertEquals(1, $evals->count());
+
+        /**
+         * @var Evaluation $eval
+         */
+        $eval = $evals->first();
+
+        $execLevel = $eval->maturityLevels->first(function (EvaluationMaturityAnswer $ml) {
+            return 'Exécution' === $ml->question->title;
+        });
+
+        $this->assertEquals(0, $execLevel->answer->level);
+    }
 }
diff --git a/tests/Feature/ExportControllerTest.php b/tests/Feature/ExportControllerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..54370381550c2b66e1e49b43f30f45070da6d876
--- /dev/null
+++ b/tests/Feature/ExportControllerTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Tests\Feature;
+
+use App\Models\Evaluation;
+use App\Models\Organization;
+use App\Models\User;
+use Illuminate\Contracts\Auth\Authenticatable;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Testing\TestResponse;
+use Tests\TestCase;
+
+class ExportControllerTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /**
+     * Test organizations export.
+     */
+    public function testExportOrganizations(): void
+    {
+        /** @var Authenticatable $user */
+        $user = User::with('organization')->first();
+        $response = $this->actingAs($user)->get(route('export.organizations', ['ext' => 'json']));
+        $this->_testJsonExportResponse($response, Organization::count());
+    }
+
+    /**
+     * Test evaluations export.
+     */
+    public function testExportEvaluations(): void
+    {
+        /** @var Authenticatable $user */
+        $user = User::with('organization')->first();
+        $response = $this->actingAs($user)->get(route('export.evaluations', ['ext' => 'json']));
+        $this->_testJsonExportResponse($response, Evaluation::count());
+    }
+
+    private function _testJsonExportResponse(TestResponse $response, int $expectedLineCount): void
+    {
+        if ($response->exception) {
+            dump($response->exception);
+        }
+        $response->assertOk();
+
+        $content = $response->json();
+        self::assertGreaterThan(0, count($content['header']));
+        self::assertSameSize($content['header'], $content['rows'][0]);
+        self::assertCount($expectedLineCount, $content['rows']);
+    }
+}
diff --git a/tests/Feature/GraphDataControllerTest.php b/tests/Feature/GraphDataControllerTest.php
index f41d613736ff80861b72cce8e360163229ed7fa3..93b8fcb80c078ea149e18a2c68c0a323c74939db 100644
--- a/tests/Feature/GraphDataControllerTest.php
+++ b/tests/Feature/GraphDataControllerTest.php
@@ -32,17 +32,18 @@ public function testCheckEvaluationMeasuresGraphData()
         $response = $this->actingAs($admin)->getJson(route('api.evaluations.graph.measures', ['id' => $evaluation->id]));
 
         $response->assertOk();
+
         $expected = [
             'labels' => [
-                    0 => 'AV et outils complémentaires',
+                    0 => 'Droits d\'accès logiques',
                     1 => 'Cloisonnement réseaux',
-                    2 => 'Contrats',
-                    3 => 'Droits d\'accès logiques',
-                    4 => 'Modes dégradés',
+                    2 => 'Modes dégradés',
+                    3 => 'AV et outils complémentaires',
+                    4 => 'Contrats',
                     5 => 'Plan informatique',
-                    6 => 'MAJ',
-                    7 => 'Mots de passe',
-                    8 => 'Sauvegardes',
+                    6 => 'Mots de passe',
+                    7 => 'Sauvegardes',
+                    8 => 'MAJ',
                     9 => 'Sensibilisation',
                 ],
             'data' => [
@@ -84,21 +85,21 @@ public function testCheckEvaluationRisksGraphData()
 
         $expected = [
             'labels' => [
-                0 => 'Sabotage, demande de rançon',
-                1 => 'Vol, recel de données, publication de données des citoyens',
-                2 => 'Détournement de fonds ',
-                3 => 'Détournement de ressources informatiques',
-                4 => 'Défiguration du site internet',
-                5 => 'Piratage de compte de messagerie',
-            ],
+                    0 => 'Sabotage, demande de rançon',
+                    1 => 'Vol, recel de données, publication de données des citoyens',
+                    2 => 'Détournement de fonds ',
+                    3 => 'Détournement de ressources informatiques',
+                    4 => 'Défiguration du site internet',
+                    5 => 'Piratage de compte de messagerie',
+                ],
             'data' => [
-                0 => 61.25,
-                1 => 61,
-                2 => 57.666666666666664,
-                3 => 61.25,
-                4 => 61.4,
-                5 => 60.166666666666664,
-            ],
+                    0 => 66.625,
+                    1 => 64.83333333333333,
+                    2 => 63.333333333333336,
+                    3 => 66.625,
+                    4 => 67.6,
+                    5 => 66.66666666666667,
+                ],
         ];
 
         $this->assertEquals($expected, $response->json());
@@ -140,16 +141,16 @@ public function testCheckEvaluationAttackGraphData()
                     9 => 'Intrusion via un prestataire ou éditeurs',
                 ],
             'data' => [
-                    0 => 57,
-                    1 => 66,
-                    2 => 56,
-                    3 => 63,
-                    4 => 60,
-                    5 => 54,
-                    6 => 62,
-                    7 => 63,
-                    8 => 65,
-                    9 => 63,
+                    0 => 60,
+                    1 => 70,
+                    2 => 61,
+                    3 => 67,
+                    4 => 74,
+                    5 => 65,
+                    6 => 65,
+                    7 => 68,
+                    8 => 68,
+                    9 => 68,
                 ],
         ];
 
@@ -185,7 +186,7 @@ public function testCheckEvaluationExpositionGraphData()
 
         $vals = collect($data['data']);
 
-        $this->assertEquals(round(100, 2), $vals->sum());
+        $this->assertEquals(round(100, 2), round($vals->sum(), 2));
 
         $expected = [
             'labels' => [
@@ -197,12 +198,12 @@ public function testCheckEvaluationExpositionGraphData()
                     5 => 'Piratage de compte de messagerie',
                 ],
             'data' => [
-                    0 => 16.88568277890094,
-                    1 => 16.816761624701343,
-                    2 => 15.897812902040068,
-                    3 => 16.88568277890094,
-                    4 => 16.927035471420698,
-                    5 => 16.58702444403602,
+                    0 => 16.83795964786656,
+                    1 => 16.385156480350446,
+                    2 => 16.00606545638347,
+                    3 => 16.83795964786656,
+                    4 => 17.084368813445096,
+                    5 => 16.848489954087867,
                 ],
         ];
 
@@ -262,4 +263,53 @@ public function testCheckEvaluationMaturityGraphData()
 
         $this->assertEquals($expected, $data);
     }
+
+    public function testEvaluationBestMeasures()
+    {
+        /**
+         * @var Evaluation $evaluation
+         */
+        $evaluation = Evaluation::with('dangerLevels')
+            ->with('maturityLevels')
+            ->with('measureLevels')
+            ->where('current_step', '>=', 4)
+            ->first();
+
+        // Set all measure levels to known quantity
+
+        foreach ($evaluation->measureLevels as $k => $measureLevel) {
+            $measureLevel->actual_level = $k % 4;
+            $measureLevel->save();
+        }
+
+        // Set all dangers levels to known quantity
+        $dangerLevel = DangerLevel::where('value', 25)->first();
+        foreach ($evaluation->dangerLevels as $k => $dangerLevelEval) {
+            $dangerLevelEval->danger_level_id = $dangerLevel->id;
+            $dangerLevelEval->save();
+        }
+
+        $admin = User::where('role', User::ROLE_ADMIN)->first();
+
+        $response = $this->actingAs($admin)->getJson(route('api.evaluations.graph.best_measures', ['id' => $evaluation->id]));
+
+        $response->assertOk();
+
+        $data = $response->json();
+
+        $expected = [
+            0 => 1,
+            1 => 3,
+            2 => 2,
+            3 => 9,
+            4 => 5,
+            5 => 7,
+            6 => 6,
+            7 => 10,
+            8 => 4,
+            9 => 8,
+        ];
+
+        $this->assertEquals($expected, $data);
+    }
 }
diff --git a/tests/Feature/UsersControllerTest.php b/tests/Feature/UsersControllerTest.php
index c32248c252be5905595e467b1dd24676dec6b0a4..b33d21b08619672a699811deeb5f28a3b0835a46 100644
--- a/tests/Feature/UsersControllerTest.php
+++ b/tests/Feature/UsersControllerTest.php
@@ -248,7 +248,7 @@ public function testAdminCanCreateUser()
             'firstname' => 'FIRSTNAME',
             'lastname' => 'LASTNAME',
             'email' => 'test@datakode.fr',
-            'password' => 'secret',
+            'password' => '1strongpassword',
             'role' => User::ROLE_USER,
             'organization_id' => 1,
             'civility' => 'Madame',
@@ -278,6 +278,50 @@ public function testAdminCanCreateUser()
         $this->assertEquals(1, $newUser->organization_id);
     }
 
+    /**
+     * Test user create.
+     */
+    public function testShortPasswordFails()
+    {
+        $user = User::where('role', User::ROLE_ADMIN)->with('organization')->first();
+
+        $response = $this->actingAs($user)->postJson(route('api.users.post'), [
+            'firstname' => 'FIRSTNAME',
+            'lastname' => 'LASTNAME',
+            'email' => 'test@datakode.fr',
+            'password' => 'test1',
+            'role' => User::ROLE_USER,
+            'organization_id' => 1,
+            'civility' => 'Madame',
+        ]);
+
+        $response->assertStatus(422);
+
+        $response->assertJson(['message' => 'Le texte password doit contenir au moins 12 caractères.']);
+    }
+
+    /**
+     * Test user create.
+     */
+    public function testNoNumberPasswordFails()
+    {
+        $user = User::where('role', User::ROLE_ADMIN)->with('organization')->first();
+
+        $response = $this->actingAs($user)->postJson(route('api.users.post'), [
+            'firstname' => 'FIRSTNAME',
+            'lastname' => 'LASTNAME',
+            'email' => 'test@datakode.fr',
+            'password' => 'testtesttest',
+            'role' => User::ROLE_USER,
+            'organization_id' => 1,
+            'civility' => 'Madame',
+        ]);
+
+        $response->assertStatus(422);
+
+        $response->assertJson(['message' => 'Le format du champ password est invalide.']);
+    }
+
     /**
      * Test user create.
      */
@@ -289,7 +333,7 @@ public function testUserCannotCreateUser()
             'firstname' => 'FIRSTNAME',
             'lastname' => 'LASTNAME',
             'email' => 'test@datakode.fr',
-            'password' => 'secret',
+            'password' => '1strongpassword',
             'role' => User::ROLE_USER,
             'civility' => 'Madame',
         ]);
diff --git a/tests/Unit/GraphDataRepositoryTest.php b/tests/Unit/GraphDataRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3414302c424e0d99ad6bca9e63efccadc03cdbaf
--- /dev/null
+++ b/tests/Unit/GraphDataRepositoryTest.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace Tests\Unit;
+
+use App\Models\Evaluation;
+use App\Models\Measure;
+use App\Models\MeasureLevel;
+use App\Models\Organization;
+use App\Models\Territory;
+use App\Repository\EvaluationRepository;
+use App\Repository\GraphDataRepository;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class GraphDataRepositoryTest extends TestCase
+{
+    public function setUp(): void
+    {
+        parent::setUp();
+
+        $this->artisan('migrate');
+    }
+
+    public function testGetActionTerritoryGraphDataWithNoDataShouldReturnZero()
+    {
+        $territory = new Territory();
+        $territory->name = 'test';
+        $territory->save();
+
+        $organisation = new Organization();
+        $organisation->territory_id = $territory->id;
+        $organisation->name = 'test org';
+        $organisation->short_name = 'testorg';
+        $organisation->type = 'CCAS';
+        $organisation->siren = '123456';
+        $organisation->active = true;
+        $organisation->save();
+
+        $evalution = new Evaluation();
+        $evalution->organization_id = $organisation->id;
+        $evalution->status = 2;
+        $evalution->current_step = 6;
+        $evalution->created_at = Carbon::now()->subDays(10);
+        $evalution->updated_at = Carbon::now();
+        $evalution->updated_by = 'test update';
+        $evalution->author = 'test author';
+        $evalution->reference = env('REFERENTIEL_VERSION');
+        $evalution->save();
+
+        $evalution = new Evaluation();
+        $evalution->organization_id = $organisation->id;
+        $evalution->status = 2;
+        $evalution->current_step = 6;
+        $evalution->created_at = Carbon::now()->subDays(10);
+        $evalution->updated_at = Carbon::now()->subDays(2);
+        $evalution->updated_by = 'test update 2';
+        $evalution->author = 'test author2';
+        $evalution->reference = env('REFERENTIEL_VERSION');
+        $evalution->save();
+
+        $evalRepo = new EvaluationRepository();
+        $repo = new GraphDataRepository($evalRepo);
+
+        $data = $repo->getActionTerritoryGraphData();
+
+        $expected = [
+            'labels' => ['test'],
+            'data' => [[0], [0]],
+        ];
+
+        $this->assertEquals($expected, $data);
+    }
+
+    public function testGetActionTerritoryGraphDataWithDataShouldReturnCorrectData()
+    {
+        $territory = new Territory();
+        $territory->name = 'test';
+        $territory->save();
+
+        $organisation = new Organization();
+        $organisation->territory_id = $territory->id;
+        $organisation->name = 'test org';
+        $organisation->short_name = 'testorg';
+        $organisation->type = 'CCAS';
+        $organisation->siren = '123456';
+        $organisation->active = true;
+        $organisation->save();
+
+        $measures = Measure::factory(5)->create();
+
+        $oldevalution = new Evaluation();
+        $oldevalution->organization_id = $organisation->id;
+        $oldevalution->status = 2;
+        $oldevalution->current_step = 6;
+        $oldevalution->created_at = Carbon::now()->subDays(10);
+        $oldevalution->updated_at = Carbon::now()->subDays(2);
+        $oldevalution->updated_by = 'test update 2';
+        $oldevalution->author = 'test author2';
+        $oldevalution->reference = env('REFERENTIEL_VERSION');
+        $oldevalution->save();
+
+        foreach ($measures as $measure) {
+            $ml = new MeasureLevel();
+            $ml->measure_id = $measure->id;
+            $ml->evaluation_id = $oldevalution->id;
+            $ml->expected_level = 2;
+            $ml->end_date = Carbon::now()->addMonths(3);
+            $ml->manager = 'test manager';
+            $ml->actual_level = 1;
+            $ml->save();
+        }
+
+        $evalution = new Evaluation();
+        $evalution->organization_id = $organisation->id;
+        $evalution->status = 2;
+        $evalution->current_step = 6;
+        $evalution->created_at = Carbon::now()->subDays(10);
+        $evalution->updated_at = Carbon::now();
+        $evalution->updated_by = 'test update';
+        $evalution->author = 'test author';
+        $evalution->reference = env('REFERENTIEL_VERSION');
+        $evalution->save();
+
+        foreach ($measures as $k => $measure) {
+            $ml = new MeasureLevel();
+            $ml->measure_id = $measure->id;
+            $ml->evaluation_id = $evalution->id;
+            $ml->expected_level = 3;
+            $ml->actual_level = $k % 4;
+            $ml->end_date = Carbon::now()->addMonths(14);
+            $ml->manager = 'test manager';
+            $ml->save();
+        }
+
+        $evalRepo = new EvaluationRepository();
+        $repo = new GraphDataRepository($evalRepo);
+
+        $data = $repo->getActionTerritoryGraphData();
+
+        $expected = [
+            'labels' => ['test'],
+            'data' => [[5], [2]],
+        ];
+
+        $this->assertEquals($expected, $data);
+    }
+
+    public function testGetOrganizationDataWithDataShouldReturnCorrectData()
+    {
+        $territory = new Territory();
+        $territory->name = 'test';
+        $territory->save();
+
+        $organisation = new Organization();
+        $organisation->territory_id = $territory->id;
+        $organisation->name = 'test org';
+        $organisation->short_name = 'testorg';
+        $organisation->type = 'CCAS';
+        $organisation->siren = '123456';
+        $organisation->active = true;
+        $organisation->save();
+
+        $measures = Measure::factory(5)->create();
+
+        $oldevalution = new Evaluation();
+        $oldevalution->organization_id = $organisation->id;
+        $oldevalution->status = 2;
+        $oldevalution->current_step = 6;
+        $oldevalution->created_at = Carbon::now()->subDays(10);
+        $oldevalution->updated_at = Carbon::now()->subDays(2);
+        $oldevalution->updated_by = 'test update 2';
+        $oldevalution->author = 'test author2';
+        $oldevalution->reference = env('REFERENTIEL_VERSION');
+        $oldevalution->save();
+
+        foreach ($measures as $k => $measure) {
+            $ml = new MeasureLevel();
+            $ml->measure_id = $measure->id;
+            $ml->evaluation_id = $oldevalution->id;
+            $ml->expected_level = $k % 4;
+            $ml->end_date = Carbon::now()->addMonths(3);
+            $ml->manager = 'test manager';
+            $ml->actual_level = 1;
+            $ml->save();
+        }
+
+        $evalution = new Evaluation();
+        $evalution->organization_id = $organisation->id;
+        $evalution->status = 2;
+        $evalution->current_step = 6;
+        $evalution->created_at = Carbon::now()->subDays(10);
+        $evalution->updated_at = Carbon::now();
+        $evalution->updated_by = 'test update';
+        $evalution->author = 'test author';
+        $evalution->reference = env('REFERENTIEL_VERSION');
+        $evalution->save();
+
+        foreach ($measures as $k => $measure) {
+            $ml = new MeasureLevel();
+            $ml->measure_id = $measure->id;
+            $ml->evaluation_id = $evalution->id;
+            $ml->expected_level = $k % 4;
+            $ml->actual_level = $k % 4;
+            $ml->end_date = Carbon::now()->addMonths(14);
+            $ml->manager = 'test manager';
+            $ml->save();
+        }
+
+        $evalRepo = new EvaluationRepository();
+        $repo = new GraphDataRepository($evalRepo);
+
+        $data = $repo->getOrganizationData();
+
+        $expected = [
+            'maturity' => 1.5,
+            'count' => 1,
+            'top_measures' => [
+                    0 => [
+                            'short_name' => $measures[1]->short_name,
+                            'organizations' => 1,
+                            'max_levels' => [
+                                    0 => 1,
+                                ],
+                            'max_value' => 1,
+                            'percentage' => 100,
+                        ],
+                    1 => [
+                            'short_name' => $measures[2]->short_name,
+                            'organizations' => 1,
+                            'max_levels' => [
+                                    0 => 2,
+                                ],
+                            'max_value' => 1,
+                            'percentage' => 100,
+                        ],
+                    2 => [
+                            'short_name' => $measures[3]->short_name,
+                            'organizations' => 1,
+                            'max_levels' => [
+                                    0 => 3,
+                                ],
+                            'max_value' => 1,
+                            'percentage' => 100,
+                        ],
+                ],
+        ];
+
+        $this->assertEquals($expected, $data);
+    }
+}
diff --git a/tests/Unit/MaturityAnswerLevelCalculatorTest.php b/tests/Unit/MaturityAnswerLevelCalculatorTest.php
index bcba8e6d0bfc8ccd723764bcf2b8d975d710a0fa..b48a179034135687842ecd89c6db3e3aba4deda0 100644
--- a/tests/Unit/MaturityAnswerLevelCalculatorTest.php
+++ b/tests/Unit/MaturityAnswerLevelCalculatorTest.php
@@ -25,9 +25,7 @@ public function testCalculateFundamentalLevelWithOneLevel()
 
         $evaluation->measureLevels->add($measureLevel);
 
-        $calculator = new MaturityAnswerLevelCalculator();
-
-        $res = $calculator->calculateFundamentalLevel($evaluation);
+        $res = MaturityAnswerLevelCalculator::calculateFundamentalLevel($evaluation);
 
         $this->assertEquals(3, $res);
     }
@@ -56,9 +54,7 @@ public function testCalculateFundamentalLevelWithSeveralLevels()
 
         $evaluation->measureLevels->add($measureLevel);
 
-        $calculator = new MaturityAnswerLevelCalculator();
-
-        $res = $calculator->calculateFundamentalLevel($evaluation);
+        $res = MaturityAnswerLevelCalculator::calculateFundamentalLevel($evaluation);
 
         $this->assertEquals(2, $res);
     }
@@ -87,9 +83,7 @@ public function testCalculateFundamentalLevelWithNonFundamentalLevels()
 
         $evaluation->measureLevels->add($measureLevel);
 
-        $calculator = new MaturityAnswerLevelCalculator();
-
-        $res = $calculator->calculateFundamentalLevel($evaluation);
+        $res = MaturityAnswerLevelCalculator::calculateFundamentalLevel($evaluation);
 
         $this->assertEquals(3, $res);
     }
@@ -134,9 +128,7 @@ public function testCalculateExecutionLevelWithEverythingOK()
         $measureLevel->actual_level = 2;
         $evaluation->measureLevels->add($measureLevel);
 
-        $calculator = new MaturityAnswerLevelCalculator();
-
-        $res = $calculator->calculateExecutionLevel($evaluation, $previousEvaluation);
+        $res = MaturityAnswerLevelCalculator::calculateExecutionLevel($evaluation, $previousEvaluation);
 
         $this->assertEquals(3, $res);
     }
@@ -181,9 +173,7 @@ public function testCalculateExecutionLevelWithHalfOK()
         $measureLevel->actual_level = 2;
         $evaluation->measureLevels->add($measureLevel);
 
-        $calculator = new MaturityAnswerLevelCalculator();
-
-        $res = $calculator->calculateExecutionLevel($evaluation, $previousEvaluation);
+        $res = MaturityAnswerLevelCalculator::calculateExecutionLevel($evaluation, $previousEvaluation);
 
         $this->assertEquals(2, $res);
     }