jdarwood007

jdarwood007 commited on 2024-01-06 15:59:46
Showing 9 changed files, with 2913 additions and 3 deletions.

... ...
@@ -0,0 +1,52 @@
1
+name: PHP Check
2
+
3
+on:
4
+  push:
5
+    branches: [ master ]
6
+  pull_request:
7
+    branches: [ master ]
8
+
9
+jobs:
10
+  lint:
11
+    runs-on: ubuntu-latest
12
+    strategy:
13
+      matrix:
14
+        php: [ 8.0, 8.1, 8.2, 8.3 ]
15
+
16
+    name: PHP ${{ matrix.php }} Syntax Check
17
+    steps:
18
+    - uses: actions/checkout@v3
19
+
20
+    - name: Setup PHP ${{ matrix.php }}
21
+      uses: shivammathur/setup-php@v2
22
+      with:
23
+        php-version: ${{ matrix.php }}
24
+        coverage: none
25
+
26
+    - name: Cache Composer packages
27
+      id: composer-cache
28
+      uses: actions/cache@v3
29
+      with:
30
+        path: vendor
31
+        key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
32
+        restore-keys: ${{ runner.os }}-php-
33
+
34
+    - name: Install dependencies
35
+      if: steps.composer-cache.outputs.cache-hit != 'true'
36
+      run: composer install --prefer-dist --no-progress --ansi
37
+
38
+    - name: Lint PHP files
39
+      run: vendor/overtrue/phplint/bin/phplint -w --exclude .git --exclude vendor --ansi .
40
+
41
+  csfixer:
42
+    runs-on: ubuntu-latest
43
+
44
+    name: PHP CS Fixer
45
+    steps:
46
+    - uses: actions/checkout@v3
47
+
48
+    - name: luminsports-php-cs-fixer
49
+      uses: luminsports/github-action-php-cs-fixer@main
50
+      with:
51
+        php-cs-fixer-version: "v3.46.0"
52
+        use-built-in-rules: false
... ...
@@ -0,0 +1,2 @@
1
+/vendor/
2
+.php-cs-fixer.cache
... ...
@@ -0,0 +1,192 @@
1
+<?php
2
+
3
+/**
4
+ * Simple Machines Forum (SMF)
5
+ *
6
+ * @package SMF
7
+ * @author Simple Machines https://www.simplemachines.org
8
+ * @copyright 2024 Simple Machines and individual contributors
9
+ * @license https://www.simplemachines.org/about/smf/license.php BSD
10
+ *
11
+ * @version 3.0 Alpha 1
12
+ */
13
+
14
+$finder = (new PhpCsFixer\Finder())
15
+	->in(__DIR__)
16
+	// Don't touch libraries.
17
+	->exclude([
18
+		'cache',
19
+		'other',
20
+		'Packages',
21
+		'Smileys',
22
+		'Sources/minify',
23
+		'Sources/random_compat',
24
+		'Sources/ReCaptcha',
25
+		'Themes',
26
+	])
27
+	// Skip all index.php files and ssi_example.php.
28
+	->notName(['index.php', 'ssi_examples.php'])
29
+	// Skip anything being ignored in .gitignore.
30
+	->ignoreVCSIgnored(true);
31
+
32
+return (new PhpCsFixer\Config())
33
+	->setRules([
34
+		'@PSR12' => true,
35
+
36
+		// PSR12 overrides.
37
+		'no_closing_tag' => false,
38
+		'no_break_comment' => false,  // A bit buggy with comments.
39
+		'statement_indentation' => false, // A bit buggy with comments.
40
+
41
+		// Array notation.
42
+		'array_syntax' => ['syntax' => 'short'],
43
+		'normalize_index_brace' => true,
44
+		'whitespace_after_comma_in_array' => true,
45
+
46
+		// Basic.
47
+		'no_trailing_comma_in_singleline' => true,
48
+
49
+		// Casing.
50
+		'class_reference_name_casing' => true,
51
+
52
+		// Cast notation.
53
+		'cast_spaces' => ['space' => 'single'],
54
+
55
+		// Control structure.
56
+		'include' => true,
57
+		'no_superfluous_elseif' => true,
58
+		'no_useless_else' => true,
59
+		'simplified_if_return' => true,
60
+		'trailing_comma_in_multiline' => [
61
+			'after_heredoc' => true,
62
+			'elements' => [
63
+				'arguments',
64
+				'arrays',
65
+				'match',
66
+				'parameters',
67
+			],
68
+		],
69
+
70
+		// Function notation.
71
+		'lambda_not_used_import' => true,
72
+		'nullable_type_declaration_for_default_null_value' => true,
73
+
74
+		// Import.
75
+		'no_unused_imports' => true,
76
+		'ordered_imports' => [
77
+			'imports_order' => [
78
+				'class',
79
+				'function',
80
+				'const',
81
+			],
82
+			'sort_algorithm' => 'alpha',
83
+		],
84
+
85
+		// Language construct.
86
+		'combine_consecutive_issets' => true,
87
+		'combine_consecutive_unsets' => true,
88
+		'nullable_type_declaration' => ['syntax' => 'question_mark'],
89
+
90
+		// Namespace notation.
91
+		'no_leading_namespace_whitespace' => true,
92
+
93
+		// Operator.
94
+		'concat_space' => ['spacing' => 'one'],
95
+		'operator_linebreak' => [
96
+			'only_booleans' => true,
97
+			'position' => 'beginning',
98
+		],
99
+		'standardize_not_equals' => true,
100
+		'ternary_to_null_coalescing' => true,
101
+
102
+		// PHPDoc.
103
+		'phpdoc_indent' => true,
104
+		'phpdoc_line_span' => [
105
+			'const' => 'multi',
106
+			'property' => 'multi',
107
+			'method' => 'multi',
108
+		],
109
+		'phpdoc_no_access' => true,
110
+		'phpdoc_no_useless_inheritdoc' => true,
111
+		'phpdoc_order' => [
112
+			'order' => [
113
+				'param',
114
+				'throws',
115
+				'return',
116
+			],
117
+		],
118
+		'phpdoc_no_empty_return' => true,
119
+		'phpdoc_param_order' => true,
120
+		'phpdoc_scalar' => [
121
+			'types' => [
122
+				'boolean',
123
+				'callback',
124
+				'double',
125
+				'integer',
126
+				'real',
127
+				'str',
128
+			],
129
+		],
130
+		'phpdoc_to_comment' => [
131
+			'ignored_tags' => ['todo'],
132
+		],
133
+		'phpdoc_trim_consecutive_blank_line_separation' => true,
134
+		'phpdoc_types' => [
135
+			'groups' => ['alias', 'meta', 'simple'],
136
+		],
137
+		'phpdoc_var_without_name' => true,
138
+
139
+		// Return notation.
140
+		'no_useless_return' => true,
141
+		'simplified_null_return' => true,
142
+
143
+		// Semicolon.
144
+		'multiline_whitespace_before_semicolons' => true,
145
+		'no_empty_statement' => true,
146
+		'no_singleline_whitespace_before_semicolons' => true,
147
+
148
+		// String notation.
149
+		'explicit_string_variable' => true,
150
+		'simple_to_complex_string_variable' => true,
151
+		'single_quote' => true,
152
+
153
+		// Whitespace.
154
+		'array_indentation' => true,
155
+		'blank_line_before_statement' => [
156
+			'statements' => [
157
+				'case',
158
+				'continue',
159
+				'declare',
160
+				'default',
161
+				'do',
162
+				'exit',
163
+				'for',
164
+				'foreach',
165
+				'goto',
166
+				'if',
167
+				'include',
168
+				'include_once',
169
+				'require',
170
+				'require_once',
171
+				'return',
172
+				'switch',
173
+				'throw',
174
+				'try',
175
+				'while',
176
+				'yield',
177
+				'yield_from',
178
+			],
179
+		],
180
+		'heredoc_indentation' => ['indentation' => 'start_plus_one'],
181
+		'method_chaining_indentation' => true,
182
+		'no_spaces_around_offset' => [
183
+			'positions' => ['inside', 'outside'],
184
+		],
185
+		'type_declaration_spaces' => [
186
+			'elements' => ['function', 'property'],
187
+		],
188
+	])
189
+	->setIndent("\t")
190
+	->setFinder($finder);
191
+
192
+?>
0 193
\ No newline at end of file
... ...
@@ -1,6 +1,6 @@
1 1
 BSD 3-Clause License
2 2
 
3
-Copyright (c) 2021, SleePy
3
+Copyright (c) 2024, SleePy
4 4
 All rights reserved.
5 5
 
6 6
 Redistribution and use in source and binary forms, with or without
... ...
@@ -0,0 +1,210 @@
1
+<?php
2
+/**
3
+ * The Main file for Hibp
4
+ * @package Hibp
5
+ * @author SleePy <sleepy @ simplemachines (dot) org>
6
+ * @copyright 2024
7
+ * @license 3-Clause BSD https://opensource.org/licenses/BSD-3-Clause
8
+ * @version 1.0
9
+ */
10
+
11
+#namespace SMF\Mod\ErrorPopup;
12
+
13
+use SMF\Config;
14
+use SMF\Db\DatabaseApi as Db;
15
+use SMF\Lang;
16
+use SMF\Theme;
17
+use SMF\User;
18
+use SMF\Utils;
19
+use SMF\WebFetch;
20
+
21
+class hibp
22
+{
23
+	/**
24
+	 * Checks the password against the Have-I-Been-Pwned database.
25
+	 *
26
+	 * @param string $password The password to check
27
+	 * @param bool $hashed If the password is hashed already or not.
28
+	 * @return bool The result if found or not.  If null, the check failed.
29
+	 */
30
+	public static function checkPassword(string $password, bool $hashed = false): ?bool
31
+	{
32
+		if (!$hashed)
33
+			$password = sha1($password);
34
+	
35
+		$passhash_prefix = Utils::entitySubstr($password, 0, 5);
36
+		$passhash_suffix = Utils::entitySubstr($password, 5);
37
+
38
+		$call_url = 'https://api.pwnedpasswords.com/range/' . $passhash_prefix;
39
+
40
+		/*
41
+		* SMF's fetch_web_data doesn't support sending headers, so we are limited in our API options
42
+		* and could build our own to do this, but this works fine.
43
+		*/
44
+		$results = WebFetchApi::fetch($call_url);
45
+
46
+		// Invalid results, just pass them through.
47
+		if (empty($results))
48
+			return null;
49
+
50
+		// Sure we could make an array of the data, but we just want to see if its found.
51
+		$found = preg_match(
52
+			'~\s+' . preg_quote($passhash_suffix) . ':\d+~i',
53
+			$results
54
+			);
55
+
56
+		// We found a result, its found.
57
+		if ($found === 1)
58
+			return true;
59
+		// No result, return false.
60
+		elseif ($found === 0)
61
+			return false;
62
+
63
+		// $found returned something invalid, also fail.
64
+		return null;
65
+	}
66
+
67
+	/**
68
+	 * Checks the password against the HiBP database.
69
+	 *
70
+	 * @calledby call_integration_hook('integrate_validatePassword', array($password, $username, $restrict_in, &$reg_error));
71
+	 * @param string $password The password to check
72
+	 * @param string $username Currently ignored by this hook.
73
+	 * @param array $restrict_in Currently ignored by this hook.
74
+	 * @param string $pass_error A password error if any.  If this is set, we won't process our hook.
75
+	 * @return void
76
+	 */
77
+	public static function validatePassword(string $password, string $username, array $restrict_in, string &$pass_error): void
78
+	{
79
+		// If another hook has set this, leave it alone.
80
+		if (!empty($pass_error) || empty(Config::$modSettings['enableHibP']))
81
+			return;
82
+
83
+		// Send it to the backend.
84
+		$res = self::checkPassword($password);
85
+
86
+		// If the result is true, we want to present a error to the prefix of $txt['profile_error_password_*']
87
+		if ($res === true)
88
+		{
89
+			Lang::load('Hibp');
90
+			$pass_error = 'hibp';
91
+		}
92
+	}
93
+
94
+	/**
95
+	 * When the password field is setup on the registration, send in some javascript.
96
+	 *
97
+	 * @calledby call_integration_hook('integrate_load_custom_profile_fields', array($memID, $area));
98
+	 * @param array $fields User profile fields we are loading.
99
+	 * @return void
100
+	 */
101
+	public static function addToRegistrationPage(int $memID, string $area): void
102
+	{
103
+		if ($area !== 'register' || empty(Config::$modSettings['enableHibPjs']))
104
+			return;
105
+
106
+		// <input type="password" name="passwrd1" id="smf_autov_pwmain" size="50" tabindex="3" class=" invalid_input">
107
+		self::buildJavascript('#smf_autov_pwmain', '#smf_autov_pwmain_div');
108
+	}
109
+	
110
+
111
+	/**
112
+	 * When the password field is setup on the profile pages, send in some javascript.
113
+	 *
114
+	 * @calledby call_integration_hook('integrate_setup_profile_context', array(&$fields));
115
+	 * @param array $fields User profile fields we are loading.
116
+	 * @return void
117
+	 */
118
+	public static function addToProfileContext(array $fields): void
119
+	{
120
+		global $modSettings;
121
+
122
+		// If we are not loading the password field, don't bother.
123
+		if (!in_array('passwrd1', $fields) || empty($modSettings['enableHibPjs']))
124
+			return;
125
+
126
+		// <input type="password" name="passwrd1" id="passwrd1" size="20" value="">
127
+		self::buildJavascript('#passwrd1', '#passwrd1');
128
+	}
129
+
130
+	public static function buildJavascript(string $selector, string $errorSelector): void
131
+	{
132
+		Lang::load('Hibp');
133
+
134
+		// Add the JS.  From: https://github.com/emn178/js-sha1
135
+		Theme::loadJavaScriptFile('sha1.js');
136
+
137
+		/*
138
+		 *	When the password is ok we use: <span class="main_icons valid"></span>
139
+		 *	When the password is bad we use: <span class="main_icons error"></span>
140
+		*/
141
+		Theme::addInlineJavaScript('
142
+			$(document).ready(function () {
143
+				$(' . Utils::JavaScriptEscape($selector) . ').on("change", function (e){
144
+					var $hibp_attachSelector = ' . Utils::JavaScriptEscape($errorSelector) . '
145
+					var $passhash = sha1($(this).val());
146
+					var $passhash_prefix = $passhash.substring(0, 5);
147
+					var $passhash_suffix = $passhash.substring(5);
148
+					var $passhash_regx = new RegExp("\\\\s+" + $passhash_suffix + ":\\\\d+", "i");
149
+				 
150
+					$.ajax({
151
+						url: "https://api.pwnedpasswords.com/range/" + $passhash_prefix,
152
+						type: "GET",
153
+						dataType: "html",
154
+						success: function (data, textStatus, xhr) {
155
+							var $res = $passhash_regx.test(data);
156
+						
157
+							// Build the box.
158
+							if (typeof $hibpBox === "undefined")
159
+								$hibpBox = $($hibp_attachSelector).parent().append(' . Utils::JavaScriptEscape('<div class="errorbox pagesection" style="width: 78%;">' . Lang::$txt['profile_error_password_hibp']. '</div>') . ');
160
+						
161
+							// It was found.
162
+							if ($res === true)
163
+								$($hibpBox).find("div.errorbox").show();
164
+							else if ($res === false)
165
+								$($hibpBox).find("div.errorbox").hide();
166
+						}				
167
+					});
168
+				});
169
+			});
170
+		');
171
+	}
172
+
173
+	/**
174
+	 * Adds Hibp options to the mangage registration.
175
+	 * General registration settings and Coppa compliance settings.
176
+	 * Accessed by ?action=admin;area=regcenter;sa=settings.
177
+	 * Requires the admin_forum permission.
178
+	 *
179
+	 * @param bool $return_config Whether or not to return the config_vars array (used for admin search)
180
+	 * @return void|array Returns nothing or returns the $config_vars array if $return_config is true
181
+	 */
182
+	public static function addToGeneralSecuritySettings(array &$config_vars): void
183
+	{
184
+		Lang::load('Hibp');
185
+
186
+		// Find the last password setting.
187
+		foreach ($config_vars as $id => $val)
188
+			if (is_array($val) && $val[1] == 'enable_password_conversion' && is_string($config_vars[$id + 1]) && $config_vars[$id + 1] == '')
189
+				break;
190
+
191
+		$varsA = array_slice($config_vars, 0, $id + 1);
192
+		$varsB = array_slice($config_vars, $id + 1);
193
+
194
+		$new_vars = [
195
+			'',
196
+			['check', 'enableHibP'],
197
+			['check', 'enableHibPjs'],
198
+		];
199
+
200
+		$config_vars = array_merge($varsA, $new_vars, $varsB);
201
+
202
+		// Saving?
203
+		if (isset($_GET['save']))
204
+		{
205
+			// Can't have one without the other.
206
+			if (!empty($_POST['enableHibPjs']) && empty($_POST['enableHibP']))
207
+				$_POST['enableHibP'] = $_POST['enableHibPjs'];
208
+		}
209
+	}
210
+}
0 211
\ No newline at end of file
... ...
@@ -0,0 +1,27 @@
1
+{
2
+    "name": "jdarwood007/smfmod_hibp",
3
+    "description": " Have-I-Been-Pwned API for SMF ",
4
+    "type": "smf-mod",
5
+    "require-dev": {
6
+        "friendsofphp/php-cs-fixer": "^3.46",
7
+        "overtrue/phplint": "9.0.4"
8
+    },
9
+    "minimum-stability": "dev",
10
+    "prefer-stable": true,
11
+    "license": "BSD 3-Clause License",
12
+    "authors": [
13
+        {
14
+            "name": "jdarwood007"
15
+        }
16
+    ],
17
+    "require": {},
18
+    "scripts": {
19
+        "lint": "php-cs-fixer check --diff --config .php-cs-fixer.dist.php --path-mode=intersection $(git diff --name-only \"*.php\")",
20
+        "lint-fix": "php-cs-fixer fix -v --config .php-cs-fixer.dist.php --path-mode=intersection $(git diff --name-only \"*.php\")"
21
+    },
22
+    "config": {
23
+        "platform": {
24
+            "php": "8.0.0"
25
+        }
26
+    }
27
+}
... ...
@@ -0,0 +1,2391 @@
1
+{
2
+    "_readme": [
3
+        "This file locks the dependencies of your project to a known state",
4
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+        "This file is @generated automatically"
6
+    ],
7
+    "content-hash": "69d2a3618d44c51855acf78d3a40767e",
8
+    "packages": [],
9
+    "packages-dev": [
10
+        {
11
+            "name": "composer/pcre",
12
+            "version": "3.1.1",
13
+            "source": {
14
+                "type": "git",
15
+                "url": "https://github.com/composer/pcre.git",
16
+                "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9"
17
+            },
18
+            "dist": {
19
+                "type": "zip",
20
+                "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9",
21
+                "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9",
22
+                "shasum": ""
23
+            },
24
+            "require": {
25
+                "php": "^7.4 || ^8.0"
26
+            },
27
+            "require-dev": {
28
+                "phpstan/phpstan": "^1.3",
29
+                "phpstan/phpstan-strict-rules": "^1.1",
30
+                "symfony/phpunit-bridge": "^5"
31
+            },
32
+            "type": "library",
33
+            "extra": {
34
+                "branch-alias": {
35
+                    "dev-main": "3.x-dev"
36
+                }
37
+            },
38
+            "autoload": {
39
+                "psr-4": {
40
+                    "Composer\\Pcre\\": "src"
41
+                }
42
+            },
43
+            "notification-url": "https://packagist.org/downloads/",
44
+            "license": [
45
+                "MIT"
46
+            ],
47
+            "authors": [
48
+                {
49
+                    "name": "Jordi Boggiano",
50
+                    "email": "j.boggiano@seld.be",
51
+                    "homepage": "http://seld.be"
52
+                }
53
+            ],
54
+            "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
55
+            "keywords": [
56
+                "PCRE",
57
+                "preg",
58
+                "regex",
59
+                "regular expression"
60
+            ],
61
+            "support": {
62
+                "issues": "https://github.com/composer/pcre/issues",
63
+                "source": "https://github.com/composer/pcre/tree/3.1.1"
64
+            },
65
+            "funding": [
66
+                {
67
+                    "url": "https://packagist.com",
68
+                    "type": "custom"
69
+                },
70
+                {
71
+                    "url": "https://github.com/composer",
72
+                    "type": "github"
73
+                },
74
+                {
75
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
76
+                    "type": "tidelift"
77
+                }
78
+            ],
79
+            "time": "2023-10-11T07:11:09+00:00"
80
+        },
81
+        {
82
+            "name": "composer/semver",
83
+            "version": "3.4.0",
84
+            "source": {
85
+                "type": "git",
86
+                "url": "https://github.com/composer/semver.git",
87
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
88
+            },
89
+            "dist": {
90
+                "type": "zip",
91
+                "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
92
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
93
+                "shasum": ""
94
+            },
95
+            "require": {
96
+                "php": "^5.3.2 || ^7.0 || ^8.0"
97
+            },
98
+            "require-dev": {
99
+                "phpstan/phpstan": "^1.4",
100
+                "symfony/phpunit-bridge": "^4.2 || ^5"
101
+            },
102
+            "type": "library",
103
+            "extra": {
104
+                "branch-alias": {
105
+                    "dev-main": "3.x-dev"
106
+                }
107
+            },
108
+            "autoload": {
109
+                "psr-4": {
110
+                    "Composer\\Semver\\": "src"
111
+                }
112
+            },
113
+            "notification-url": "https://packagist.org/downloads/",
114
+            "license": [
115
+                "MIT"
116
+            ],
117
+            "authors": [
118
+                {
119
+                    "name": "Nils Adermann",
120
+                    "email": "naderman@naderman.de",
121
+                    "homepage": "http://www.naderman.de"
122
+                },
123
+                {
124
+                    "name": "Jordi Boggiano",
125
+                    "email": "j.boggiano@seld.be",
126
+                    "homepage": "http://seld.be"
127
+                },
128
+                {
129
+                    "name": "Rob Bast",
130
+                    "email": "rob.bast@gmail.com",
131
+                    "homepage": "http://robbast.nl"
132
+                }
133
+            ],
134
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
135
+            "keywords": [
136
+                "semantic",
137
+                "semver",
138
+                "validation",
139
+                "versioning"
140
+            ],
141
+            "support": {
142
+                "irc": "ircs://irc.libera.chat:6697/composer",
143
+                "issues": "https://github.com/composer/semver/issues",
144
+                "source": "https://github.com/composer/semver/tree/3.4.0"
145
+            },
146
+            "funding": [
147
+                {
148
+                    "url": "https://packagist.com",
149
+                    "type": "custom"
150
+                },
151
+                {
152
+                    "url": "https://github.com/composer",
153
+                    "type": "github"
154
+                },
155
+                {
156
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
157
+                    "type": "tidelift"
158
+                }
159
+            ],
160
+            "time": "2023-08-31T09:50:34+00:00"
161
+        },
162
+        {
163
+            "name": "composer/xdebug-handler",
164
+            "version": "3.0.3",
165
+            "source": {
166
+                "type": "git",
167
+                "url": "https://github.com/composer/xdebug-handler.git",
168
+                "reference": "ced299686f41dce890debac69273b47ffe98a40c"
169
+            },
170
+            "dist": {
171
+                "type": "zip",
172
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
173
+                "reference": "ced299686f41dce890debac69273b47ffe98a40c",
174
+                "shasum": ""
175
+            },
176
+            "require": {
177
+                "composer/pcre": "^1 || ^2 || ^3",
178
+                "php": "^7.2.5 || ^8.0",
179
+                "psr/log": "^1 || ^2 || ^3"
180
+            },
181
+            "require-dev": {
182
+                "phpstan/phpstan": "^1.0",
183
+                "phpstan/phpstan-strict-rules": "^1.1",
184
+                "symfony/phpunit-bridge": "^6.0"
185
+            },
186
+            "type": "library",
187
+            "autoload": {
188
+                "psr-4": {
189
+                    "Composer\\XdebugHandler\\": "src"
190
+                }
191
+            },
192
+            "notification-url": "https://packagist.org/downloads/",
193
+            "license": [
194
+                "MIT"
195
+            ],
196
+            "authors": [
197
+                {
198
+                    "name": "John Stevenson",
199
+                    "email": "john-stevenson@blueyonder.co.uk"
200
+                }
201
+            ],
202
+            "description": "Restarts a process without Xdebug.",
203
+            "keywords": [
204
+                "Xdebug",
205
+                "performance"
206
+            ],
207
+            "support": {
208
+                "irc": "irc://irc.freenode.org/composer",
209
+                "issues": "https://github.com/composer/xdebug-handler/issues",
210
+                "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
211
+            },
212
+            "funding": [
213
+                {
214
+                    "url": "https://packagist.com",
215
+                    "type": "custom"
216
+                },
217
+                {
218
+                    "url": "https://github.com/composer",
219
+                    "type": "github"
220
+                },
221
+                {
222
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
223
+                    "type": "tidelift"
224
+                }
225
+            ],
226
+            "time": "2022-02-25T21:32:43+00:00"
227
+        },
228
+        {
229
+            "name": "friendsofphp/php-cs-fixer",
230
+            "version": "v3.46.0",
231
+            "source": {
232
+                "type": "git",
233
+                "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
234
+                "reference": "be6831c9af1740470d2a773119b9273f8ac1c3d2"
235
+            },
236
+            "dist": {
237
+                "type": "zip",
238
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/be6831c9af1740470d2a773119b9273f8ac1c3d2",
239
+                "reference": "be6831c9af1740470d2a773119b9273f8ac1c3d2",
240
+                "shasum": ""
241
+            },
242
+            "require": {
243
+                "composer/semver": "^3.4",
244
+                "composer/xdebug-handler": "^3.0.3",
245
+                "ext-filter": "*",
246
+                "ext-json": "*",
247
+                "ext-tokenizer": "*",
248
+                "php": "^7.4 || ^8.0",
249
+                "sebastian/diff": "^4.0 || ^5.0",
250
+                "symfony/console": "^5.4 || ^6.0 || ^7.0",
251
+                "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
252
+                "symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
253
+                "symfony/finder": "^5.4 || ^6.0 || ^7.0",
254
+                "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
255
+                "symfony/polyfill-mbstring": "^1.28",
256
+                "symfony/polyfill-php80": "^1.28",
257
+                "symfony/polyfill-php81": "^1.28",
258
+                "symfony/process": "^5.4 || ^6.0 || ^7.0",
259
+                "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
260
+            },
261
+            "require-dev": {
262
+                "facile-it/paraunit": "^1.3 || ^2.0",
263
+                "justinrainbow/json-schema": "^5.2",
264
+                "keradus/cli-executor": "^2.1",
265
+                "mikey179/vfsstream": "^1.6.11",
266
+                "php-coveralls/php-coveralls": "^2.7",
267
+                "php-cs-fixer/accessible-object": "^1.1",
268
+                "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4",
269
+                "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4",
270
+                "phpunit/phpunit": "^9.6 || ^10.5.5",
271
+                "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
272
+            },
273
+            "suggest": {
274
+                "ext-dom": "For handling output formats in XML",
275
+                "ext-mbstring": "For handling non-UTF8 characters."
276
+            },
277
+            "bin": [
278
+                "php-cs-fixer"
279
+            ],
280
+            "type": "application",
281
+            "autoload": {
282
+                "psr-4": {
283
+                    "PhpCsFixer\\": "src/"
284
+                }
285
+            },
286
+            "notification-url": "https://packagist.org/downloads/",
287
+            "license": [
288
+                "MIT"
289
+            ],
290
+            "authors": [
291
+                {
292
+                    "name": "Fabien Potencier",
293
+                    "email": "fabien@symfony.com"
294
+                },
295
+                {
296
+                    "name": "Dariusz Rumiński",
297
+                    "email": "dariusz.ruminski@gmail.com"
298
+                }
299
+            ],
300
+            "description": "A tool to automatically fix PHP code style",
301
+            "keywords": [
302
+                "Static code analysis",
303
+                "fixer",
304
+                "standards",
305
+                "static analysis"
306
+            ],
307
+            "support": {
308
+                "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
309
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.46.0"
310
+            },
311
+            "funding": [
312
+                {
313
+                    "url": "https://github.com/keradus",
314
+                    "type": "github"
315
+                }
316
+            ],
317
+            "time": "2024-01-03T21:38:46+00:00"
318
+        },
319
+        {
320
+            "name": "overtrue/phplint",
321
+            "version": "9.0.4",
322
+            "source": {
323
+                "type": "git",
324
+                "url": "https://github.com/overtrue/phplint.git",
325
+                "reference": "da8aa332372fbbf9aed174ed45ad190aed848b9a"
326
+            },
327
+            "dist": {
328
+                "type": "zip",
329
+                "url": "https://api.github.com/repos/overtrue/phplint/zipball/da8aa332372fbbf9aed174ed45ad190aed848b9a",
330
+                "reference": "da8aa332372fbbf9aed174ed45ad190aed848b9a",
331
+                "shasum": ""
332
+            },
333
+            "require": {
334
+                "ext-json": "*",
335
+                "php": "^8.0",
336
+                "symfony/cache": "^5.4 || ^6.0",
337
+                "symfony/console": "^5.4 || ^6.0",
338
+                "symfony/event-dispatcher": "^5.4 || ^6.0",
339
+                "symfony/finder": "^5.4 || ^6.0",
340
+                "symfony/options-resolver": "^5.4 || ^6.0",
341
+                "symfony/process": "^5.4 || ^6.0",
342
+                "symfony/yaml": "^5.4 || ^6.0"
343
+            },
344
+            "require-dev": {
345
+                "bamarni/composer-bin-plugin": "^1.4",
346
+                "brainmaestro/composer-git-hooks": "^2.8.5 || 3.0.0-alpha.1",
347
+                "jetbrains/phpstorm-stubs": "^2021.3 || ^2022.3",
348
+                "php-parallel-lint/php-console-highlighter": "^1.0"
349
+            },
350
+            "bin": [
351
+                "bin/phplint"
352
+            ],
353
+            "type": "library",
354
+            "extra": {
355
+                "hooks": {
356
+                    "pre-commit": [
357
+                        "composer fix-style"
358
+                    ]
359
+                },
360
+                "branch-alias": {
361
+                    "dev-main": "9.0.x-dev"
362
+                }
363
+            },
364
+            "autoload": {
365
+                "psr-4": {
366
+                    "Overtrue\\PHPLint\\": "src/"
367
+                }
368
+            },
369
+            "notification-url": "https://packagist.org/downloads/",
370
+            "license": [
371
+                "MIT"
372
+            ],
373
+            "authors": [
374
+                {
375
+                    "name": "overtrue",
376
+                    "email": "anzhengchao@gmail.com"
377
+                },
378
+                {
379
+                    "name": "Laurent Laville",
380
+                    "homepage": "https://github.com/llaville"
381
+                }
382
+            ],
383
+            "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.",
384
+            "keywords": [
385
+                "check",
386
+                "lint",
387
+                "phplint",
388
+                "syntax"
389
+            ],
390
+            "support": {
391
+                "issues": "https://github.com/overtrue/phplint/issues",
392
+                "source": "https://github.com/overtrue/phplint/tree/9.0.4"
393
+            },
394
+            "funding": [
395
+                {
396
+                    "url": "https://github.com/overtrue",
397
+                    "type": "github"
398
+                }
399
+            ],
400
+            "time": "2023-02-23T15:46:09+00:00"
401
+        },
402
+        {
403
+            "name": "psr/cache",
404
+            "version": "2.0.0",
405
+            "source": {
406
+                "type": "git",
407
+                "url": "https://github.com/php-fig/cache.git",
408
+                "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b"
409
+            },
410
+            "dist": {
411
+                "type": "zip",
412
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
413
+                "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
414
+                "shasum": ""
415
+            },
416
+            "require": {
417
+                "php": ">=8.0.0"
418
+            },
419
+            "type": "library",
420
+            "extra": {
421
+                "branch-alias": {
422
+                    "dev-master": "1.0.x-dev"
423
+                }
424
+            },
425
+            "autoload": {
426
+                "psr-4": {
427
+                    "Psr\\Cache\\": "src/"
428
+                }
429
+            },
430
+            "notification-url": "https://packagist.org/downloads/",
431
+            "license": [
432
+                "MIT"
433
+            ],
434
+            "authors": [
435
+                {
436
+                    "name": "PHP-FIG",
437
+                    "homepage": "https://www.php-fig.org/"
438
+                }
439
+            ],
440
+            "description": "Common interface for caching libraries",
441
+            "keywords": [
442
+                "cache",
443
+                "psr",
444
+                "psr-6"
445
+            ],
446
+            "support": {
447
+                "source": "https://github.com/php-fig/cache/tree/2.0.0"
448
+            },
449
+            "time": "2021-02-03T23:23:37+00:00"
450
+        },
451
+        {
452
+            "name": "psr/container",
453
+            "version": "1.1.2",
454
+            "source": {
455
+                "type": "git",
456
+                "url": "https://github.com/php-fig/container.git",
457
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
458
+            },
459
+            "dist": {
460
+                "type": "zip",
461
+                "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
462
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
463
+                "shasum": ""
464
+            },
465
+            "require": {
466
+                "php": ">=7.4.0"
467
+            },
468
+            "type": "library",
469
+            "autoload": {
470
+                "psr-4": {
471
+                    "Psr\\Container\\": "src/"
472
+                }
473
+            },
474
+            "notification-url": "https://packagist.org/downloads/",
475
+            "license": [
476
+                "MIT"
477
+            ],
478
+            "authors": [
479
+                {
480
+                    "name": "PHP-FIG",
481
+                    "homepage": "https://www.php-fig.org/"
482
+                }
483
+            ],
484
+            "description": "Common Container Interface (PHP FIG PSR-11)",
485
+            "homepage": "https://github.com/php-fig/container",
486
+            "keywords": [
487
+                "PSR-11",
488
+                "container",
489
+                "container-interface",
490
+                "container-interop",
491
+                "psr"
492
+            ],
493
+            "support": {
494
+                "issues": "https://github.com/php-fig/container/issues",
495
+                "source": "https://github.com/php-fig/container/tree/1.1.2"
496
+            },
497
+            "time": "2021-11-05T16:50:12+00:00"
498
+        },
499
+        {
500
+            "name": "psr/event-dispatcher",
501
+            "version": "1.0.0",
502
+            "source": {
503
+                "type": "git",
504
+                "url": "https://github.com/php-fig/event-dispatcher.git",
505
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
506
+            },
507
+            "dist": {
508
+                "type": "zip",
509
+                "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
510
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
511
+                "shasum": ""
512
+            },
513
+            "require": {
514
+                "php": ">=7.2.0"
515
+            },
516
+            "type": "library",
517
+            "extra": {
518
+                "branch-alias": {
519
+                    "dev-master": "1.0.x-dev"
520
+                }
521
+            },
522
+            "autoload": {
523
+                "psr-4": {
524
+                    "Psr\\EventDispatcher\\": "src/"
525
+                }
526
+            },
527
+            "notification-url": "https://packagist.org/downloads/",
528
+            "license": [
529
+                "MIT"
530
+            ],
531
+            "authors": [
532
+                {
533
+                    "name": "PHP-FIG",
534
+                    "homepage": "http://www.php-fig.org/"
535
+                }
536
+            ],
537
+            "description": "Standard interfaces for event handling.",
538
+            "keywords": [
539
+                "events",
540
+                "psr",
541
+                "psr-14"
542
+            ],
543
+            "support": {
544
+                "issues": "https://github.com/php-fig/event-dispatcher/issues",
545
+                "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
546
+            },
547
+            "time": "2019-01-08T18:20:26+00:00"
548
+        },
549
+        {
550
+            "name": "psr/log",
551
+            "version": "2.0.0",
552
+            "source": {
553
+                "type": "git",
554
+                "url": "https://github.com/php-fig/log.git",
555
+                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
556
+            },
557
+            "dist": {
558
+                "type": "zip",
559
+                "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
560
+                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
561
+                "shasum": ""
562
+            },
563
+            "require": {
564
+                "php": ">=8.0.0"
565
+            },
566
+            "type": "library",
567
+            "extra": {
568
+                "branch-alias": {
569
+                    "dev-master": "2.0.x-dev"
570
+                }
571
+            },
572
+            "autoload": {
573
+                "psr-4": {
574
+                    "Psr\\Log\\": "src"
575
+                }
576
+            },
577
+            "notification-url": "https://packagist.org/downloads/",
578
+            "license": [
579
+                "MIT"
580
+            ],
581
+            "authors": [
582
+                {
583
+                    "name": "PHP-FIG",
584
+                    "homepage": "https://www.php-fig.org/"
585
+                }
586
+            ],
587
+            "description": "Common interface for logging libraries",
588
+            "homepage": "https://github.com/php-fig/log",
589
+            "keywords": [
590
+                "log",
591
+                "psr",
592
+                "psr-3"
593
+            ],
594
+            "support": {
595
+                "source": "https://github.com/php-fig/log/tree/2.0.0"
596
+            },
597
+            "time": "2021-07-14T16:41:46+00:00"
598
+        },
599
+        {
600
+            "name": "sebastian/diff",
601
+            "version": "4.0.5",
602
+            "source": {
603
+                "type": "git",
604
+                "url": "https://github.com/sebastianbergmann/diff.git",
605
+                "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
606
+            },
607
+            "dist": {
608
+                "type": "zip",
609
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
610
+                "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
611
+                "shasum": ""
612
+            },
613
+            "require": {
614
+                "php": ">=7.3"
615
+            },
616
+            "require-dev": {
617
+                "phpunit/phpunit": "^9.3",
618
+                "symfony/process": "^4.2 || ^5"
619
+            },
620
+            "type": "library",
621
+            "extra": {
622
+                "branch-alias": {
623
+                    "dev-master": "4.0-dev"
624
+                }
625
+            },
626
+            "autoload": {
627
+                "classmap": [
628
+                    "src/"
629
+                ]
630
+            },
631
+            "notification-url": "https://packagist.org/downloads/",
632
+            "license": [
633
+                "BSD-3-Clause"
634
+            ],
635
+            "authors": [
636
+                {
637
+                    "name": "Sebastian Bergmann",
638
+                    "email": "sebastian@phpunit.de"
639
+                },
640
+                {
641
+                    "name": "Kore Nordmann",
642
+                    "email": "mail@kore-nordmann.de"
643
+                }
644
+            ],
645
+            "description": "Diff implementation",
646
+            "homepage": "https://github.com/sebastianbergmann/diff",
647
+            "keywords": [
648
+                "diff",
649
+                "udiff",
650
+                "unidiff",
651
+                "unified diff"
652
+            ],
653
+            "support": {
654
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
655
+                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5"
656
+            },
657
+            "funding": [
658
+                {
659
+                    "url": "https://github.com/sebastianbergmann",
660
+                    "type": "github"
661
+                }
662
+            ],
663
+            "time": "2023-05-07T05:35:17+00:00"
664
+        },
665
+        {
666
+            "name": "symfony/cache",
667
+            "version": "v5.4.34",
668
+            "source": {
669
+                "type": "git",
670
+                "url": "https://github.com/symfony/cache.git",
671
+                "reference": "b17f28169f7a2f2c0cddf2b044d729f5b75efe5a"
672
+            },
673
+            "dist": {
674
+                "type": "zip",
675
+                "url": "https://api.github.com/repos/symfony/cache/zipball/b17f28169f7a2f2c0cddf2b044d729f5b75efe5a",
676
+                "reference": "b17f28169f7a2f2c0cddf2b044d729f5b75efe5a",
677
+                "shasum": ""
678
+            },
679
+            "require": {
680
+                "php": ">=7.2.5",
681
+                "psr/cache": "^1.0|^2.0",
682
+                "psr/log": "^1.1|^2|^3",
683
+                "symfony/cache-contracts": "^1.1.7|^2",
684
+                "symfony/deprecation-contracts": "^2.1|^3",
685
+                "symfony/polyfill-php73": "^1.9",
686
+                "symfony/polyfill-php80": "^1.16",
687
+                "symfony/service-contracts": "^1.1|^2|^3",
688
+                "symfony/var-exporter": "^4.4|^5.0|^6.0"
689
+            },
690
+            "conflict": {
691
+                "doctrine/dbal": "<2.13.1",
692
+                "symfony/dependency-injection": "<4.4",
693
+                "symfony/http-kernel": "<4.4",
694
+                "symfony/var-dumper": "<4.4"
695
+            },
696
+            "provide": {
697
+                "psr/cache-implementation": "1.0|2.0",
698
+                "psr/simple-cache-implementation": "1.0|2.0",
699
+                "symfony/cache-implementation": "1.0|2.0"
700
+            },
701
+            "require-dev": {
702
+                "cache/integration-tests": "dev-master",
703
+                "doctrine/cache": "^1.6|^2.0",
704
+                "doctrine/dbal": "^2.13.1|^3|^4",
705
+                "predis/predis": "^1.1",
706
+                "psr/simple-cache": "^1.0|^2.0",
707
+                "symfony/config": "^4.4|^5.0|^6.0",
708
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
709
+                "symfony/filesystem": "^4.4|^5.0|^6.0",
710
+                "symfony/http-kernel": "^4.4|^5.0|^6.0",
711
+                "symfony/messenger": "^4.4|^5.0|^6.0",
712
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
713
+            },
714
+            "type": "library",
715
+            "autoload": {
716
+                "psr-4": {
717
+                    "Symfony\\Component\\Cache\\": ""
718
+                },
719
+                "exclude-from-classmap": [
720
+                    "/Tests/"
721
+                ]
722
+            },
723
+            "notification-url": "https://packagist.org/downloads/",
724
+            "license": [
725
+                "MIT"
726
+            ],
727
+            "authors": [
728
+                {
729
+                    "name": "Nicolas Grekas",
730
+                    "email": "p@tchwork.com"
731
+                },
732
+                {
733
+                    "name": "Symfony Community",
734
+                    "homepage": "https://symfony.com/contributors"
735
+                }
736
+            ],
737
+            "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
738
+            "homepage": "https://symfony.com",
739
+            "keywords": [
740
+                "caching",
741
+                "psr6"
742
+            ],
743
+            "support": {
744
+                "source": "https://github.com/symfony/cache/tree/v5.4.34"
745
+            },
746
+            "funding": [
747
+                {
748
+                    "url": "https://symfony.com/sponsor",
749
+                    "type": "custom"
750
+                },
751
+                {
752
+                    "url": "https://github.com/fabpot",
753
+                    "type": "github"
754
+                },
755
+                {
756
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
757
+                    "type": "tidelift"
758
+                }
759
+            ],
760
+            "time": "2023-12-18T14:56:06+00:00"
761
+        },
762
+        {
763
+            "name": "symfony/cache-contracts",
764
+            "version": "v2.5.2",
765
+            "source": {
766
+                "type": "git",
767
+                "url": "https://github.com/symfony/cache-contracts.git",
768
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
769
+            },
770
+            "dist": {
771
+                "type": "zip",
772
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
773
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
774
+                "shasum": ""
775
+            },
776
+            "require": {
777
+                "php": ">=7.2.5",
778
+                "psr/cache": "^1.0|^2.0|^3.0"
779
+            },
780
+            "suggest": {
781
+                "symfony/cache-implementation": ""
782
+            },
783
+            "type": "library",
784
+            "extra": {
785
+                "branch-alias": {
786
+                    "dev-main": "2.5-dev"
787
+                },
788
+                "thanks": {
789
+                    "name": "symfony/contracts",
790
+                    "url": "https://github.com/symfony/contracts"
791
+                }
792
+            },
793
+            "autoload": {
794
+                "psr-4": {
795
+                    "Symfony\\Contracts\\Cache\\": ""
796
+                }
797
+            },
798
+            "notification-url": "https://packagist.org/downloads/",
799
+            "license": [
800
+                "MIT"
801
+            ],
802
+            "authors": [
803
+                {
804
+                    "name": "Nicolas Grekas",
805
+                    "email": "p@tchwork.com"
806
+                },
807
+                {
808
+                    "name": "Symfony Community",
809
+                    "homepage": "https://symfony.com/contributors"
810
+                }
811
+            ],
812
+            "description": "Generic abstractions related to caching",
813
+            "homepage": "https://symfony.com",
814
+            "keywords": [
815
+                "abstractions",
816
+                "contracts",
817
+                "decoupling",
818
+                "interfaces",
819
+                "interoperability",
820
+                "standards"
821
+            ],
822
+            "support": {
823
+                "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2"
824
+            },
825
+            "funding": [
826
+                {
827
+                    "url": "https://symfony.com/sponsor",
828
+                    "type": "custom"
829
+                },
830
+                {
831
+                    "url": "https://github.com/fabpot",
832
+                    "type": "github"
833
+                },
834
+                {
835
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
836
+                    "type": "tidelift"
837
+                }
838
+            ],
839
+            "time": "2022-01-02T09:53:40+00:00"
840
+        },
841
+        {
842
+            "name": "symfony/console",
843
+            "version": "v5.4.34",
844
+            "source": {
845
+                "type": "git",
846
+                "url": "https://github.com/symfony/console.git",
847
+                "reference": "4b4d8cd118484aa604ec519062113dd87abde18c"
848
+            },
849
+            "dist": {
850
+                "type": "zip",
851
+                "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c",
852
+                "reference": "4b4d8cd118484aa604ec519062113dd87abde18c",
853
+                "shasum": ""
854
+            },
855
+            "require": {
856
+                "php": ">=7.2.5",
857
+                "symfony/deprecation-contracts": "^2.1|^3",
858
+                "symfony/polyfill-mbstring": "~1.0",
859
+                "symfony/polyfill-php73": "^1.9",
860
+                "symfony/polyfill-php80": "^1.16",
861
+                "symfony/service-contracts": "^1.1|^2|^3",
862
+                "symfony/string": "^5.1|^6.0"
863
+            },
864
+            "conflict": {
865
+                "psr/log": ">=3",
866
+                "symfony/dependency-injection": "<4.4",
867
+                "symfony/dotenv": "<5.1",
868
+                "symfony/event-dispatcher": "<4.4",
869
+                "symfony/lock": "<4.4",
870
+                "symfony/process": "<4.4"
871
+            },
872
+            "provide": {
873
+                "psr/log-implementation": "1.0|2.0"
874
+            },
875
+            "require-dev": {
876
+                "psr/log": "^1|^2",
877
+                "symfony/config": "^4.4|^5.0|^6.0",
878
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
879
+                "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
880
+                "symfony/lock": "^4.4|^5.0|^6.0",
881
+                "symfony/process": "^4.4|^5.0|^6.0",
882
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
883
+            },
884
+            "suggest": {
885
+                "psr/log": "For using the console logger",
886
+                "symfony/event-dispatcher": "",
887
+                "symfony/lock": "",
888
+                "symfony/process": ""
889
+            },
890
+            "type": "library",
891
+            "autoload": {
892
+                "psr-4": {
893
+                    "Symfony\\Component\\Console\\": ""
894
+                },
895
+                "exclude-from-classmap": [
896
+                    "/Tests/"
897
+                ]
898
+            },
899
+            "notification-url": "https://packagist.org/downloads/",
900
+            "license": [
901
+                "MIT"
902
+            ],
903
+            "authors": [
904
+                {
905
+                    "name": "Fabien Potencier",
906
+                    "email": "fabien@symfony.com"
907
+                },
908
+                {
909
+                    "name": "Symfony Community",
910
+                    "homepage": "https://symfony.com/contributors"
911
+                }
912
+            ],
913
+            "description": "Eases the creation of beautiful and testable command line interfaces",
914
+            "homepage": "https://symfony.com",
915
+            "keywords": [
916
+                "cli",
917
+                "command-line",
918
+                "console",
919
+                "terminal"
920
+            ],
921
+            "support": {
922
+                "source": "https://github.com/symfony/console/tree/v5.4.34"
923
+            },
924
+            "funding": [
925
+                {
926
+                    "url": "https://symfony.com/sponsor",
927
+                    "type": "custom"
928
+                },
929
+                {
930
+                    "url": "https://github.com/fabpot",
931
+                    "type": "github"
932
+                },
933
+                {
934
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
935
+                    "type": "tidelift"
936
+                }
937
+            ],
938
+            "time": "2023-12-08T13:33:03+00:00"
939
+        },
940
+        {
941
+            "name": "symfony/deprecation-contracts",
942
+            "version": "v2.5.2",
943
+            "source": {
944
+                "type": "git",
945
+                "url": "https://github.com/symfony/deprecation-contracts.git",
946
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
947
+            },
948
+            "dist": {
949
+                "type": "zip",
950
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
951
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
952
+                "shasum": ""
953
+            },
954
+            "require": {
955
+                "php": ">=7.1"
956
+            },
957
+            "type": "library",
958
+            "extra": {
959
+                "branch-alias": {
960
+                    "dev-main": "2.5-dev"
961
+                },
962
+                "thanks": {
963
+                    "name": "symfony/contracts",
964
+                    "url": "https://github.com/symfony/contracts"
965
+                }
966
+            },
967
+            "autoload": {
968
+                "files": [
969
+                    "function.php"
970
+                ]
971
+            },
972
+            "notification-url": "https://packagist.org/downloads/",
973
+            "license": [
974
+                "MIT"
975
+            ],
976
+            "authors": [
977
+                {
978
+                    "name": "Nicolas Grekas",
979
+                    "email": "p@tchwork.com"
980
+                },
981
+                {
982
+                    "name": "Symfony Community",
983
+                    "homepage": "https://symfony.com/contributors"
984
+                }
985
+            ],
986
+            "description": "A generic function and convention to trigger deprecation notices",
987
+            "homepage": "https://symfony.com",
988
+            "support": {
989
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
990
+            },
991
+            "funding": [
992
+                {
993
+                    "url": "https://symfony.com/sponsor",
994
+                    "type": "custom"
995
+                },
996
+                {
997
+                    "url": "https://github.com/fabpot",
998
+                    "type": "github"
999
+                },
1000
+                {
1001
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1002
+                    "type": "tidelift"
1003
+                }
1004
+            ],
1005
+            "time": "2022-01-02T09:53:40+00:00"
1006
+        },
1007
+        {
1008
+            "name": "symfony/event-dispatcher",
1009
+            "version": "v5.4.34",
1010
+            "source": {
1011
+                "type": "git",
1012
+                "url": "https://github.com/symfony/event-dispatcher.git",
1013
+                "reference": "e3bca343efeb613f843c254e7718ef17c9bdf7a3"
1014
+            },
1015
+            "dist": {
1016
+                "type": "zip",
1017
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e3bca343efeb613f843c254e7718ef17c9bdf7a3",
1018
+                "reference": "e3bca343efeb613f843c254e7718ef17c9bdf7a3",
1019
+                "shasum": ""
1020
+            },
1021
+            "require": {
1022
+                "php": ">=7.2.5",
1023
+                "symfony/deprecation-contracts": "^2.1|^3",
1024
+                "symfony/event-dispatcher-contracts": "^2|^3",
1025
+                "symfony/polyfill-php80": "^1.16"
1026
+            },
1027
+            "conflict": {
1028
+                "symfony/dependency-injection": "<4.4"
1029
+            },
1030
+            "provide": {
1031
+                "psr/event-dispatcher-implementation": "1.0",
1032
+                "symfony/event-dispatcher-implementation": "2.0"
1033
+            },
1034
+            "require-dev": {
1035
+                "psr/log": "^1|^2|^3",
1036
+                "symfony/config": "^4.4|^5.0|^6.0",
1037
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
1038
+                "symfony/error-handler": "^4.4|^5.0|^6.0",
1039
+                "symfony/expression-language": "^4.4|^5.0|^6.0",
1040
+                "symfony/http-foundation": "^4.4|^5.0|^6.0",
1041
+                "symfony/service-contracts": "^1.1|^2|^3",
1042
+                "symfony/stopwatch": "^4.4|^5.0|^6.0"
1043
+            },
1044
+            "suggest": {
1045
+                "symfony/dependency-injection": "",
1046
+                "symfony/http-kernel": ""
1047
+            },
1048
+            "type": "library",
1049
+            "autoload": {
1050
+                "psr-4": {
1051
+                    "Symfony\\Component\\EventDispatcher\\": ""
1052
+                },
1053
+                "exclude-from-classmap": [
1054
+                    "/Tests/"
1055
+                ]
1056
+            },
1057
+            "notification-url": "https://packagist.org/downloads/",
1058
+            "license": [
1059
+                "MIT"
1060
+            ],
1061
+            "authors": [
1062
+                {
1063
+                    "name": "Fabien Potencier",
1064
+                    "email": "fabien@symfony.com"
1065
+                },
1066
+                {
1067
+                    "name": "Symfony Community",
1068
+                    "homepage": "https://symfony.com/contributors"
1069
+                }
1070
+            ],
1071
+            "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
1072
+            "homepage": "https://symfony.com",
1073
+            "support": {
1074
+                "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.34"
1075
+            },
1076
+            "funding": [
1077
+                {
1078
+                    "url": "https://symfony.com/sponsor",
1079
+                    "type": "custom"
1080
+                },
1081
+                {
1082
+                    "url": "https://github.com/fabpot",
1083
+                    "type": "github"
1084
+                },
1085
+                {
1086
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1087
+                    "type": "tidelift"
1088
+                }
1089
+            ],
1090
+            "time": "2023-12-27T21:12:56+00:00"
1091
+        },
1092
+        {
1093
+            "name": "symfony/event-dispatcher-contracts",
1094
+            "version": "v2.5.2",
1095
+            "source": {
1096
+                "type": "git",
1097
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
1098
+                "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
1099
+            },
1100
+            "dist": {
1101
+                "type": "zip",
1102
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
1103
+                "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
1104
+                "shasum": ""
1105
+            },
1106
+            "require": {
1107
+                "php": ">=7.2.5",
1108
+                "psr/event-dispatcher": "^1"
1109
+            },
1110
+            "suggest": {
1111
+                "symfony/event-dispatcher-implementation": ""
1112
+            },
1113
+            "type": "library",
1114
+            "extra": {
1115
+                "branch-alias": {
1116
+                    "dev-main": "2.5-dev"
1117
+                },
1118
+                "thanks": {
1119
+                    "name": "symfony/contracts",
1120
+                    "url": "https://github.com/symfony/contracts"
1121
+                }
1122
+            },
1123
+            "autoload": {
1124
+                "psr-4": {
1125
+                    "Symfony\\Contracts\\EventDispatcher\\": ""
1126
+                }
1127
+            },
1128
+            "notification-url": "https://packagist.org/downloads/",
1129
+            "license": [
1130
+                "MIT"
1131
+            ],
1132
+            "authors": [
1133
+                {
1134
+                    "name": "Nicolas Grekas",
1135
+                    "email": "p@tchwork.com"
1136
+                },
1137
+                {
1138
+                    "name": "Symfony Community",
1139
+                    "homepage": "https://symfony.com/contributors"
1140
+                }
1141
+            ],
1142
+            "description": "Generic abstractions related to dispatching event",
1143
+            "homepage": "https://symfony.com",
1144
+            "keywords": [
1145
+                "abstractions",
1146
+                "contracts",
1147
+                "decoupling",
1148
+                "interfaces",
1149
+                "interoperability",
1150
+                "standards"
1151
+            ],
1152
+            "support": {
1153
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2"
1154
+            },
1155
+            "funding": [
1156
+                {
1157
+                    "url": "https://symfony.com/sponsor",
1158
+                    "type": "custom"
1159
+                },
1160
+                {
1161
+                    "url": "https://github.com/fabpot",
1162
+                    "type": "github"
1163
+                },
1164
+                {
1165
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1166
+                    "type": "tidelift"
1167
+                }
1168
+            ],
1169
+            "time": "2022-01-02T09:53:40+00:00"
1170
+        },
1171
+        {
1172
+            "name": "symfony/filesystem",
1173
+            "version": "v5.4.25",
1174
+            "source": {
1175
+                "type": "git",
1176
+                "url": "https://github.com/symfony/filesystem.git",
1177
+                "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364"
1178
+            },
1179
+            "dist": {
1180
+                "type": "zip",
1181
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
1182
+                "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
1183
+                "shasum": ""
1184
+            },
1185
+            "require": {
1186
+                "php": ">=7.2.5",
1187
+                "symfony/polyfill-ctype": "~1.8",
1188
+                "symfony/polyfill-mbstring": "~1.8",
1189
+                "symfony/polyfill-php80": "^1.16"
1190
+            },
1191
+            "type": "library",
1192
+            "autoload": {
1193
+                "psr-4": {
1194
+                    "Symfony\\Component\\Filesystem\\": ""
1195
+                },
1196
+                "exclude-from-classmap": [
1197
+                    "/Tests/"
1198
+                ]
1199
+            },
1200
+            "notification-url": "https://packagist.org/downloads/",
1201
+            "license": [
1202
+                "MIT"
1203
+            ],
1204
+            "authors": [
1205
+                {
1206
+                    "name": "Fabien Potencier",
1207
+                    "email": "fabien@symfony.com"
1208
+                },
1209
+                {
1210
+                    "name": "Symfony Community",
1211
+                    "homepage": "https://symfony.com/contributors"
1212
+                }
1213
+            ],
1214
+            "description": "Provides basic utilities for the filesystem",
1215
+            "homepage": "https://symfony.com",
1216
+            "support": {
1217
+                "source": "https://github.com/symfony/filesystem/tree/v5.4.25"
1218
+            },
1219
+            "funding": [
1220
+                {
1221
+                    "url": "https://symfony.com/sponsor",
1222
+                    "type": "custom"
1223
+                },
1224
+                {
1225
+                    "url": "https://github.com/fabpot",
1226
+                    "type": "github"
1227
+                },
1228
+                {
1229
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1230
+                    "type": "tidelift"
1231
+                }
1232
+            ],
1233
+            "time": "2023-05-31T13:04:02+00:00"
1234
+        },
1235
+        {
1236
+            "name": "symfony/finder",
1237
+            "version": "v5.4.27",
1238
+            "source": {
1239
+                "type": "git",
1240
+                "url": "https://github.com/symfony/finder.git",
1241
+                "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d"
1242
+            },
1243
+            "dist": {
1244
+                "type": "zip",
1245
+                "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d",
1246
+                "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d",
1247
+                "shasum": ""
1248
+            },
1249
+            "require": {
1250
+                "php": ">=7.2.5",
1251
+                "symfony/deprecation-contracts": "^2.1|^3",
1252
+                "symfony/polyfill-php80": "^1.16"
1253
+            },
1254
+            "type": "library",
1255
+            "autoload": {
1256
+                "psr-4": {
1257
+                    "Symfony\\Component\\Finder\\": ""
1258
+                },
1259
+                "exclude-from-classmap": [
1260
+                    "/Tests/"
1261
+                ]
1262
+            },
1263
+            "notification-url": "https://packagist.org/downloads/",
1264
+            "license": [
1265
+                "MIT"
1266
+            ],
1267
+            "authors": [
1268
+                {
1269
+                    "name": "Fabien Potencier",
1270
+                    "email": "fabien@symfony.com"
1271
+                },
1272
+                {
1273
+                    "name": "Symfony Community",
1274
+                    "homepage": "https://symfony.com/contributors"
1275
+                }
1276
+            ],
1277
+            "description": "Finds files and directories via an intuitive fluent interface",
1278
+            "homepage": "https://symfony.com",
1279
+            "support": {
1280
+                "source": "https://github.com/symfony/finder/tree/v5.4.27"
1281
+            },
1282
+            "funding": [
1283
+                {
1284
+                    "url": "https://symfony.com/sponsor",
1285
+                    "type": "custom"
1286
+                },
1287
+                {
1288
+                    "url": "https://github.com/fabpot",
1289
+                    "type": "github"
1290
+                },
1291
+                {
1292
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1293
+                    "type": "tidelift"
1294
+                }
1295
+            ],
1296
+            "time": "2023-07-31T08:02:31+00:00"
1297
+        },
1298
+        {
1299
+            "name": "symfony/options-resolver",
1300
+            "version": "v5.4.21",
1301
+            "source": {
1302
+                "type": "git",
1303
+                "url": "https://github.com/symfony/options-resolver.git",
1304
+                "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9"
1305
+            },
1306
+            "dist": {
1307
+                "type": "zip",
1308
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9",
1309
+                "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9",
1310
+                "shasum": ""
1311
+            },
1312
+            "require": {
1313
+                "php": ">=7.2.5",
1314
+                "symfony/deprecation-contracts": "^2.1|^3",
1315
+                "symfony/polyfill-php73": "~1.0",
1316
+                "symfony/polyfill-php80": "^1.16"
1317
+            },
1318
+            "type": "library",
1319
+            "autoload": {
1320
+                "psr-4": {
1321
+                    "Symfony\\Component\\OptionsResolver\\": ""
1322
+                },
1323
+                "exclude-from-classmap": [
1324
+                    "/Tests/"
1325
+                ]
1326
+            },
1327
+            "notification-url": "https://packagist.org/downloads/",
1328
+            "license": [
1329
+                "MIT"
1330
+            ],
1331
+            "authors": [
1332
+                {
1333
+                    "name": "Fabien Potencier",
1334
+                    "email": "fabien@symfony.com"
1335
+                },
1336
+                {
1337
+                    "name": "Symfony Community",
1338
+                    "homepage": "https://symfony.com/contributors"
1339
+                }
1340
+            ],
1341
+            "description": "Provides an improved replacement for the array_replace PHP function",
1342
+            "homepage": "https://symfony.com",
1343
+            "keywords": [
1344
+                "config",
1345
+                "configuration",
1346
+                "options"
1347
+            ],
1348
+            "support": {
1349
+                "source": "https://github.com/symfony/options-resolver/tree/v5.4.21"
1350
+            },
1351
+            "funding": [
1352
+                {
1353
+                    "url": "https://symfony.com/sponsor",
1354
+                    "type": "custom"
1355
+                },
1356
+                {
1357
+                    "url": "https://github.com/fabpot",
1358
+                    "type": "github"
1359
+                },
1360
+                {
1361
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1362
+                    "type": "tidelift"
1363
+                }
1364
+            ],
1365
+            "time": "2023-02-14T08:03:56+00:00"
1366
+        },
1367
+        {
1368
+            "name": "symfony/polyfill-ctype",
1369
+            "version": "v1.28.0",
1370
+            "source": {
1371
+                "type": "git",
1372
+                "url": "https://github.com/symfony/polyfill-ctype.git",
1373
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
1374
+            },
1375
+            "dist": {
1376
+                "type": "zip",
1377
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
1378
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
1379
+                "shasum": ""
1380
+            },
1381
+            "require": {
1382
+                "php": ">=7.1"
1383
+            },
1384
+            "provide": {
1385
+                "ext-ctype": "*"
1386
+            },
1387
+            "suggest": {
1388
+                "ext-ctype": "For best performance"
1389
+            },
1390
+            "type": "library",
1391
+            "extra": {
1392
+                "branch-alias": {
1393
+                    "dev-main": "1.28-dev"
1394
+                },
1395
+                "thanks": {
1396
+                    "name": "symfony/polyfill",
1397
+                    "url": "https://github.com/symfony/polyfill"
1398
+                }
1399
+            },
1400
+            "autoload": {
1401
+                "files": [
1402
+                    "bootstrap.php"
1403
+                ],
1404
+                "psr-4": {
1405
+                    "Symfony\\Polyfill\\Ctype\\": ""
1406
+                }
1407
+            },
1408
+            "notification-url": "https://packagist.org/downloads/",
1409
+            "license": [
1410
+                "MIT"
1411
+            ],
1412
+            "authors": [
1413
+                {
1414
+                    "name": "Gert de Pagter",
1415
+                    "email": "BackEndTea@gmail.com"
1416
+                },
1417
+                {
1418
+                    "name": "Symfony Community",
1419
+                    "homepage": "https://symfony.com/contributors"
1420
+                }
1421
+            ],
1422
+            "description": "Symfony polyfill for ctype functions",
1423
+            "homepage": "https://symfony.com",
1424
+            "keywords": [
1425
+                "compatibility",
1426
+                "ctype",
1427
+                "polyfill",
1428
+                "portable"
1429
+            ],
1430
+            "support": {
1431
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
1432
+            },
1433
+            "funding": [
1434
+                {
1435
+                    "url": "https://symfony.com/sponsor",
1436
+                    "type": "custom"
1437
+                },
1438
+                {
1439
+                    "url": "https://github.com/fabpot",
1440
+                    "type": "github"
1441
+                },
1442
+                {
1443
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1444
+                    "type": "tidelift"
1445
+                }
1446
+            ],
1447
+            "time": "2023-01-26T09:26:14+00:00"
1448
+        },
1449
+        {
1450
+            "name": "symfony/polyfill-intl-grapheme",
1451
+            "version": "v1.28.0",
1452
+            "source": {
1453
+                "type": "git",
1454
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
1455
+                "reference": "875e90aeea2777b6f135677f618529449334a612"
1456
+            },
1457
+            "dist": {
1458
+                "type": "zip",
1459
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
1460
+                "reference": "875e90aeea2777b6f135677f618529449334a612",
1461
+                "shasum": ""
1462
+            },
1463
+            "require": {
1464
+                "php": ">=7.1"
1465
+            },
1466
+            "suggest": {
1467
+                "ext-intl": "For best performance"
1468
+            },
1469
+            "type": "library",
1470
+            "extra": {
1471
+                "branch-alias": {
1472
+                    "dev-main": "1.28-dev"
1473
+                },
1474
+                "thanks": {
1475
+                    "name": "symfony/polyfill",
1476
+                    "url": "https://github.com/symfony/polyfill"
1477
+                }
1478
+            },
1479
+            "autoload": {
1480
+                "files": [
1481
+                    "bootstrap.php"
1482
+                ],
1483
+                "psr-4": {
1484
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
1485
+                }
1486
+            },
1487
+            "notification-url": "https://packagist.org/downloads/",
1488
+            "license": [
1489
+                "MIT"
1490
+            ],
1491
+            "authors": [
1492
+                {
1493
+                    "name": "Nicolas Grekas",
1494
+                    "email": "p@tchwork.com"
1495
+                },
1496
+                {
1497
+                    "name": "Symfony Community",
1498
+                    "homepage": "https://symfony.com/contributors"
1499
+                }
1500
+            ],
1501
+            "description": "Symfony polyfill for intl's grapheme_* functions",
1502
+            "homepage": "https://symfony.com",
1503
+            "keywords": [
1504
+                "compatibility",
1505
+                "grapheme",
1506
+                "intl",
1507
+                "polyfill",
1508
+                "portable",
1509
+                "shim"
1510
+            ],
1511
+            "support": {
1512
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
1513
+            },
1514
+            "funding": [
1515
+                {
1516
+                    "url": "https://symfony.com/sponsor",
1517
+                    "type": "custom"
1518
+                },
1519
+                {
1520
+                    "url": "https://github.com/fabpot",
1521
+                    "type": "github"
1522
+                },
1523
+                {
1524
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1525
+                    "type": "tidelift"
1526
+                }
1527
+            ],
1528
+            "time": "2023-01-26T09:26:14+00:00"
1529
+        },
1530
+        {
1531
+            "name": "symfony/polyfill-intl-normalizer",
1532
+            "version": "v1.28.0",
1533
+            "source": {
1534
+                "type": "git",
1535
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
1536
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
1537
+            },
1538
+            "dist": {
1539
+                "type": "zip",
1540
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
1541
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
1542
+                "shasum": ""
1543
+            },
1544
+            "require": {
1545
+                "php": ">=7.1"
1546
+            },
1547
+            "suggest": {
1548
+                "ext-intl": "For best performance"
1549
+            },
1550
+            "type": "library",
1551
+            "extra": {
1552
+                "branch-alias": {
1553
+                    "dev-main": "1.28-dev"
1554
+                },
1555
+                "thanks": {
1556
+                    "name": "symfony/polyfill",
1557
+                    "url": "https://github.com/symfony/polyfill"
1558
+                }
1559
+            },
1560
+            "autoload": {
1561
+                "files": [
1562
+                    "bootstrap.php"
1563
+                ],
1564
+                "psr-4": {
1565
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
1566
+                },
1567
+                "classmap": [
1568
+                    "Resources/stubs"
1569
+                ]
1570
+            },
1571
+            "notification-url": "https://packagist.org/downloads/",
1572
+            "license": [
1573
+                "MIT"
1574
+            ],
1575
+            "authors": [
1576
+                {
1577
+                    "name": "Nicolas Grekas",
1578
+                    "email": "p@tchwork.com"
1579
+                },
1580
+                {
1581
+                    "name": "Symfony Community",
1582
+                    "homepage": "https://symfony.com/contributors"
1583
+                }
1584
+            ],
1585
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
1586
+            "homepage": "https://symfony.com",
1587
+            "keywords": [
1588
+                "compatibility",
1589
+                "intl",
1590
+                "normalizer",
1591
+                "polyfill",
1592
+                "portable",
1593
+                "shim"
1594
+            ],
1595
+            "support": {
1596
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
1597
+            },
1598
+            "funding": [
1599
+                {
1600
+                    "url": "https://symfony.com/sponsor",
1601
+                    "type": "custom"
1602
+                },
1603
+                {
1604
+                    "url": "https://github.com/fabpot",
1605
+                    "type": "github"
1606
+                },
1607
+                {
1608
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1609
+                    "type": "tidelift"
1610
+                }
1611
+            ],
1612
+            "time": "2023-01-26T09:26:14+00:00"
1613
+        },
1614
+        {
1615
+            "name": "symfony/polyfill-mbstring",
1616
+            "version": "v1.28.0",
1617
+            "source": {
1618
+                "type": "git",
1619
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
1620
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
1621
+            },
1622
+            "dist": {
1623
+                "type": "zip",
1624
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
1625
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
1626
+                "shasum": ""
1627
+            },
1628
+            "require": {
1629
+                "php": ">=7.1"
1630
+            },
1631
+            "provide": {
1632
+                "ext-mbstring": "*"
1633
+            },
1634
+            "suggest": {
1635
+                "ext-mbstring": "For best performance"
1636
+            },
1637
+            "type": "library",
1638
+            "extra": {
1639
+                "branch-alias": {
1640
+                    "dev-main": "1.28-dev"
1641
+                },
1642
+                "thanks": {
1643
+                    "name": "symfony/polyfill",
1644
+                    "url": "https://github.com/symfony/polyfill"
1645
+                }
1646
+            },
1647
+            "autoload": {
1648
+                "files": [
1649
+                    "bootstrap.php"
1650
+                ],
1651
+                "psr-4": {
1652
+                    "Symfony\\Polyfill\\Mbstring\\": ""
1653
+                }
1654
+            },
1655
+            "notification-url": "https://packagist.org/downloads/",
1656
+            "license": [
1657
+                "MIT"
1658
+            ],
1659
+            "authors": [
1660
+                {
1661
+                    "name": "Nicolas Grekas",
1662
+                    "email": "p@tchwork.com"
1663
+                },
1664
+                {
1665
+                    "name": "Symfony Community",
1666
+                    "homepage": "https://symfony.com/contributors"
1667
+                }
1668
+            ],
1669
+            "description": "Symfony polyfill for the Mbstring extension",
1670
+            "homepage": "https://symfony.com",
1671
+            "keywords": [
1672
+                "compatibility",
1673
+                "mbstring",
1674
+                "polyfill",
1675
+                "portable",
1676
+                "shim"
1677
+            ],
1678
+            "support": {
1679
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
1680
+            },
1681
+            "funding": [
1682
+                {
1683
+                    "url": "https://symfony.com/sponsor",
1684
+                    "type": "custom"
1685
+                },
1686
+                {
1687
+                    "url": "https://github.com/fabpot",
1688
+                    "type": "github"
1689
+                },
1690
+                {
1691
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1692
+                    "type": "tidelift"
1693
+                }
1694
+            ],
1695
+            "time": "2023-07-28T09:04:16+00:00"
1696
+        },
1697
+        {
1698
+            "name": "symfony/polyfill-php73",
1699
+            "version": "v1.28.0",
1700
+            "source": {
1701
+                "type": "git",
1702
+                "url": "https://github.com/symfony/polyfill-php73.git",
1703
+                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
1704
+            },
1705
+            "dist": {
1706
+                "type": "zip",
1707
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
1708
+                "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
1709
+                "shasum": ""
1710
+            },
1711
+            "require": {
1712
+                "php": ">=7.1"
1713
+            },
1714
+            "type": "library",
1715
+            "extra": {
1716
+                "branch-alias": {
1717
+                    "dev-main": "1.28-dev"
1718
+                },
1719
+                "thanks": {
1720
+                    "name": "symfony/polyfill",
1721
+                    "url": "https://github.com/symfony/polyfill"
1722
+                }
1723
+            },
1724
+            "autoload": {
1725
+                "files": [
1726
+                    "bootstrap.php"
1727
+                ],
1728
+                "psr-4": {
1729
+                    "Symfony\\Polyfill\\Php73\\": ""
1730
+                },
1731
+                "classmap": [
1732
+                    "Resources/stubs"
1733
+                ]
1734
+            },
1735
+            "notification-url": "https://packagist.org/downloads/",
1736
+            "license": [
1737
+                "MIT"
1738
+            ],
1739
+            "authors": [
1740
+                {
1741
+                    "name": "Nicolas Grekas",
1742
+                    "email": "p@tchwork.com"
1743
+                },
1744
+                {
1745
+                    "name": "Symfony Community",
1746
+                    "homepage": "https://symfony.com/contributors"
1747
+                }
1748
+            ],
1749
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
1750
+            "homepage": "https://symfony.com",
1751
+            "keywords": [
1752
+                "compatibility",
1753
+                "polyfill",
1754
+                "portable",
1755
+                "shim"
1756
+            ],
1757
+            "support": {
1758
+                "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0"
1759
+            },
1760
+            "funding": [
1761
+                {
1762
+                    "url": "https://symfony.com/sponsor",
1763
+                    "type": "custom"
1764
+                },
1765
+                {
1766
+                    "url": "https://github.com/fabpot",
1767
+                    "type": "github"
1768
+                },
1769
+                {
1770
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1771
+                    "type": "tidelift"
1772
+                }
1773
+            ],
1774
+            "time": "2023-01-26T09:26:14+00:00"
1775
+        },
1776
+        {
1777
+            "name": "symfony/polyfill-php80",
1778
+            "version": "v1.28.0",
1779
+            "source": {
1780
+                "type": "git",
1781
+                "url": "https://github.com/symfony/polyfill-php80.git",
1782
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
1783
+            },
1784
+            "dist": {
1785
+                "type": "zip",
1786
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
1787
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
1788
+                "shasum": ""
1789
+            },
1790
+            "require": {
1791
+                "php": ">=7.1"
1792
+            },
1793
+            "type": "library",
1794
+            "extra": {
1795
+                "branch-alias": {
1796
+                    "dev-main": "1.28-dev"
1797
+                },
1798
+                "thanks": {
1799
+                    "name": "symfony/polyfill",
1800
+                    "url": "https://github.com/symfony/polyfill"
1801
+                }
1802
+            },
1803
+            "autoload": {
1804
+                "files": [
1805
+                    "bootstrap.php"
1806
+                ],
1807
+                "psr-4": {
1808
+                    "Symfony\\Polyfill\\Php80\\": ""
1809
+                },
1810
+                "classmap": [
1811
+                    "Resources/stubs"
1812
+                ]
1813
+            },
1814
+            "notification-url": "https://packagist.org/downloads/",
1815
+            "license": [
1816
+                "MIT"
1817
+            ],
1818
+            "authors": [
1819
+                {
1820
+                    "name": "Ion Bazan",
1821
+                    "email": "ion.bazan@gmail.com"
1822
+                },
1823
+                {
1824
+                    "name": "Nicolas Grekas",
1825
+                    "email": "p@tchwork.com"
1826
+                },
1827
+                {
1828
+                    "name": "Symfony Community",
1829
+                    "homepage": "https://symfony.com/contributors"
1830
+                }
1831
+            ],
1832
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
1833
+            "homepage": "https://symfony.com",
1834
+            "keywords": [
1835
+                "compatibility",
1836
+                "polyfill",
1837
+                "portable",
1838
+                "shim"
1839
+            ],
1840
+            "support": {
1841
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
1842
+            },
1843
+            "funding": [
1844
+                {
1845
+                    "url": "https://symfony.com/sponsor",
1846
+                    "type": "custom"
1847
+                },
1848
+                {
1849
+                    "url": "https://github.com/fabpot",
1850
+                    "type": "github"
1851
+                },
1852
+                {
1853
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1854
+                    "type": "tidelift"
1855
+                }
1856
+            ],
1857
+            "time": "2023-01-26T09:26:14+00:00"
1858
+        },
1859
+        {
1860
+            "name": "symfony/polyfill-php81",
1861
+            "version": "v1.28.0",
1862
+            "source": {
1863
+                "type": "git",
1864
+                "url": "https://github.com/symfony/polyfill-php81.git",
1865
+                "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b"
1866
+            },
1867
+            "dist": {
1868
+                "type": "zip",
1869
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b",
1870
+                "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b",
1871
+                "shasum": ""
1872
+            },
1873
+            "require": {
1874
+                "php": ">=7.1"
1875
+            },
1876
+            "type": "library",
1877
+            "extra": {
1878
+                "branch-alias": {
1879
+                    "dev-main": "1.28-dev"
1880
+                },
1881
+                "thanks": {
1882
+                    "name": "symfony/polyfill",
1883
+                    "url": "https://github.com/symfony/polyfill"
1884
+                }
1885
+            },
1886
+            "autoload": {
1887
+                "files": [
1888
+                    "bootstrap.php"
1889
+                ],
1890
+                "psr-4": {
1891
+                    "Symfony\\Polyfill\\Php81\\": ""
1892
+                },
1893
+                "classmap": [
1894
+                    "Resources/stubs"
1895
+                ]
1896
+            },
1897
+            "notification-url": "https://packagist.org/downloads/",
1898
+            "license": [
1899
+                "MIT"
1900
+            ],
1901
+            "authors": [
1902
+                {
1903
+                    "name": "Nicolas Grekas",
1904
+                    "email": "p@tchwork.com"
1905
+                },
1906
+                {
1907
+                    "name": "Symfony Community",
1908
+                    "homepage": "https://symfony.com/contributors"
1909
+                }
1910
+            ],
1911
+            "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
1912
+            "homepage": "https://symfony.com",
1913
+            "keywords": [
1914
+                "compatibility",
1915
+                "polyfill",
1916
+                "portable",
1917
+                "shim"
1918
+            ],
1919
+            "support": {
1920
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0"
1921
+            },
1922
+            "funding": [
1923
+                {
1924
+                    "url": "https://symfony.com/sponsor",
1925
+                    "type": "custom"
1926
+                },
1927
+                {
1928
+                    "url": "https://github.com/fabpot",
1929
+                    "type": "github"
1930
+                },
1931
+                {
1932
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1933
+                    "type": "tidelift"
1934
+                }
1935
+            ],
1936
+            "time": "2023-01-26T09:26:14+00:00"
1937
+        },
1938
+        {
1939
+            "name": "symfony/process",
1940
+            "version": "v5.4.34",
1941
+            "source": {
1942
+                "type": "git",
1943
+                "url": "https://github.com/symfony/process.git",
1944
+                "reference": "8fa22178dfc368911dbd513b431cd9b06f9afe7a"
1945
+            },
1946
+            "dist": {
1947
+                "type": "zip",
1948
+                "url": "https://api.github.com/repos/symfony/process/zipball/8fa22178dfc368911dbd513b431cd9b06f9afe7a",
1949
+                "reference": "8fa22178dfc368911dbd513b431cd9b06f9afe7a",
1950
+                "shasum": ""
1951
+            },
1952
+            "require": {
1953
+                "php": ">=7.2.5",
1954
+                "symfony/polyfill-php80": "^1.16"
1955
+            },
1956
+            "type": "library",
1957
+            "autoload": {
1958
+                "psr-4": {
1959
+                    "Symfony\\Component\\Process\\": ""
1960
+                },
1961
+                "exclude-from-classmap": [
1962
+                    "/Tests/"
1963
+                ]
1964
+            },
1965
+            "notification-url": "https://packagist.org/downloads/",
1966
+            "license": [
1967
+                "MIT"
1968
+            ],
1969
+            "authors": [
1970
+                {
1971
+                    "name": "Fabien Potencier",
1972
+                    "email": "fabien@symfony.com"
1973
+                },
1974
+                {
1975
+                    "name": "Symfony Community",
1976
+                    "homepage": "https://symfony.com/contributors"
1977
+                }
1978
+            ],
1979
+            "description": "Executes commands in sub-processes",
1980
+            "homepage": "https://symfony.com",
1981
+            "support": {
1982
+                "source": "https://github.com/symfony/process/tree/v5.4.34"
1983
+            },
1984
+            "funding": [
1985
+                {
1986
+                    "url": "https://symfony.com/sponsor",
1987
+                    "type": "custom"
1988
+                },
1989
+                {
1990
+                    "url": "https://github.com/fabpot",
1991
+                    "type": "github"
1992
+                },
1993
+                {
1994
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1995
+                    "type": "tidelift"
1996
+                }
1997
+            ],
1998
+            "time": "2023-12-02T08:41:43+00:00"
1999
+        },
2000
+        {
2001
+            "name": "symfony/service-contracts",
2002
+            "version": "v2.5.2",
2003
+            "source": {
2004
+                "type": "git",
2005
+                "url": "https://github.com/symfony/service-contracts.git",
2006
+                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
2007
+            },
2008
+            "dist": {
2009
+                "type": "zip",
2010
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
2011
+                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
2012
+                "shasum": ""
2013
+            },
2014
+            "require": {
2015
+                "php": ">=7.2.5",
2016
+                "psr/container": "^1.1",
2017
+                "symfony/deprecation-contracts": "^2.1|^3"
2018
+            },
2019
+            "conflict": {
2020
+                "ext-psr": "<1.1|>=2"
2021
+            },
2022
+            "suggest": {
2023
+                "symfony/service-implementation": ""
2024
+            },
2025
+            "type": "library",
2026
+            "extra": {
2027
+                "branch-alias": {
2028
+                    "dev-main": "2.5-dev"
2029
+                },
2030
+                "thanks": {
2031
+                    "name": "symfony/contracts",
2032
+                    "url": "https://github.com/symfony/contracts"
2033
+                }
2034
+            },
2035
+            "autoload": {
2036
+                "psr-4": {
2037
+                    "Symfony\\Contracts\\Service\\": ""
2038
+                }
2039
+            },
2040
+            "notification-url": "https://packagist.org/downloads/",
2041
+            "license": [
2042
+                "MIT"
2043
+            ],
2044
+            "authors": [
2045
+                {
2046
+                    "name": "Nicolas Grekas",
2047
+                    "email": "p@tchwork.com"
2048
+                },
2049
+                {
2050
+                    "name": "Symfony Community",
2051
+                    "homepage": "https://symfony.com/contributors"
2052
+                }
2053
+            ],
2054
+            "description": "Generic abstractions related to writing services",
2055
+            "homepage": "https://symfony.com",
2056
+            "keywords": [
2057
+                "abstractions",
2058
+                "contracts",
2059
+                "decoupling",
2060
+                "interfaces",
2061
+                "interoperability",
2062
+                "standards"
2063
+            ],
2064
+            "support": {
2065
+                "source": "https://github.com/symfony/service-contracts/tree/v2.5.2"
2066
+            },
2067
+            "funding": [
2068
+                {
2069
+                    "url": "https://symfony.com/sponsor",
2070
+                    "type": "custom"
2071
+                },
2072
+                {
2073
+                    "url": "https://github.com/fabpot",
2074
+                    "type": "github"
2075
+                },
2076
+                {
2077
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2078
+                    "type": "tidelift"
2079
+                }
2080
+            ],
2081
+            "time": "2022-05-30T19:17:29+00:00"
2082
+        },
2083
+        {
2084
+            "name": "symfony/stopwatch",
2085
+            "version": "v5.4.21",
2086
+            "source": {
2087
+                "type": "git",
2088
+                "url": "https://github.com/symfony/stopwatch.git",
2089
+                "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee"
2090
+            },
2091
+            "dist": {
2092
+                "type": "zip",
2093
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee",
2094
+                "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee",
2095
+                "shasum": ""
2096
+            },
2097
+            "require": {
2098
+                "php": ">=7.2.5",
2099
+                "symfony/service-contracts": "^1|^2|^3"
2100
+            },
2101
+            "type": "library",
2102
+            "autoload": {
2103
+                "psr-4": {
2104
+                    "Symfony\\Component\\Stopwatch\\": ""
2105
+                },
2106
+                "exclude-from-classmap": [
2107
+                    "/Tests/"
2108
+                ]
2109
+            },
2110
+            "notification-url": "https://packagist.org/downloads/",
2111
+            "license": [
2112
+                "MIT"
2113
+            ],
2114
+            "authors": [
2115
+                {
2116
+                    "name": "Fabien Potencier",
2117
+                    "email": "fabien@symfony.com"
2118
+                },
2119
+                {
2120
+                    "name": "Symfony Community",
2121
+                    "homepage": "https://symfony.com/contributors"
2122
+                }
2123
+            ],
2124
+            "description": "Provides a way to profile code",
2125
+            "homepage": "https://symfony.com",
2126
+            "support": {
2127
+                "source": "https://github.com/symfony/stopwatch/tree/v5.4.21"
2128
+            },
2129
+            "funding": [
2130
+                {
2131
+                    "url": "https://symfony.com/sponsor",
2132
+                    "type": "custom"
2133
+                },
2134
+                {
2135
+                    "url": "https://github.com/fabpot",
2136
+                    "type": "github"
2137
+                },
2138
+                {
2139
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2140
+                    "type": "tidelift"
2141
+                }
2142
+            ],
2143
+            "time": "2023-02-14T08:03:56+00:00"
2144
+        },
2145
+        {
2146
+            "name": "symfony/string",
2147
+            "version": "v5.4.34",
2148
+            "source": {
2149
+                "type": "git",
2150
+                "url": "https://github.com/symfony/string.git",
2151
+                "reference": "e3f98bfc7885c957488f443df82d97814a3ce061"
2152
+            },
2153
+            "dist": {
2154
+                "type": "zip",
2155
+                "url": "https://api.github.com/repos/symfony/string/zipball/e3f98bfc7885c957488f443df82d97814a3ce061",
2156
+                "reference": "e3f98bfc7885c957488f443df82d97814a3ce061",
2157
+                "shasum": ""
2158
+            },
2159
+            "require": {
2160
+                "php": ">=7.2.5",
2161
+                "symfony/polyfill-ctype": "~1.8",
2162
+                "symfony/polyfill-intl-grapheme": "~1.0",
2163
+                "symfony/polyfill-intl-normalizer": "~1.0",
2164
+                "symfony/polyfill-mbstring": "~1.0",
2165
+                "symfony/polyfill-php80": "~1.15"
2166
+            },
2167
+            "conflict": {
2168
+                "symfony/translation-contracts": ">=3.0"
2169
+            },
2170
+            "require-dev": {
2171
+                "symfony/error-handler": "^4.4|^5.0|^6.0",
2172
+                "symfony/http-client": "^4.4|^5.0|^6.0",
2173
+                "symfony/translation-contracts": "^1.1|^2",
2174
+                "symfony/var-exporter": "^4.4|^5.0|^6.0"
2175
+            },
2176
+            "type": "library",
2177
+            "autoload": {
2178
+                "files": [
2179
+                    "Resources/functions.php"
2180
+                ],
2181
+                "psr-4": {
2182
+                    "Symfony\\Component\\String\\": ""
2183
+                },
2184
+                "exclude-from-classmap": [
2185
+                    "/Tests/"
2186
+                ]
2187
+            },
2188
+            "notification-url": "https://packagist.org/downloads/",
2189
+            "license": [
2190
+                "MIT"
2191
+            ],
2192
+            "authors": [
2193
+                {
2194
+                    "name": "Nicolas Grekas",
2195
+                    "email": "p@tchwork.com"
2196
+                },
2197
+                {
2198
+                    "name": "Symfony Community",
2199
+                    "homepage": "https://symfony.com/contributors"
2200
+                }
2201
+            ],
2202
+            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
2203
+            "homepage": "https://symfony.com",
2204
+            "keywords": [
2205
+                "grapheme",
2206
+                "i18n",
2207
+                "string",
2208
+                "unicode",
2209
+                "utf-8",
2210
+                "utf8"
2211
+            ],
2212
+            "support": {
2213
+                "source": "https://github.com/symfony/string/tree/v5.4.34"
2214
+            },
2215
+            "funding": [
2216
+                {
2217
+                    "url": "https://symfony.com/sponsor",
2218
+                    "type": "custom"
2219
+                },
2220
+                {
2221
+                    "url": "https://github.com/fabpot",
2222
+                    "type": "github"
2223
+                },
2224
+                {
2225
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2226
+                    "type": "tidelift"
2227
+                }
2228
+            ],
2229
+            "time": "2023-12-09T13:20:28+00:00"
2230
+        },
2231
+        {
2232
+            "name": "symfony/var-exporter",
2233
+            "version": "v5.4.32",
2234
+            "source": {
2235
+                "type": "git",
2236
+                "url": "https://github.com/symfony/var-exporter.git",
2237
+                "reference": "fdb022f0d3d41df240c18e2eb9a117c430f06add"
2238
+            },
2239
+            "dist": {
2240
+                "type": "zip",
2241
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fdb022f0d3d41df240c18e2eb9a117c430f06add",
2242
+                "reference": "fdb022f0d3d41df240c18e2eb9a117c430f06add",
2243
+                "shasum": ""
2244
+            },
2245
+            "require": {
2246
+                "php": ">=7.2.5",
2247
+                "symfony/polyfill-php80": "^1.16"
2248
+            },
2249
+            "require-dev": {
2250
+                "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
2251
+            },
2252
+            "type": "library",
2253
+            "autoload": {
2254
+                "psr-4": {
2255
+                    "Symfony\\Component\\VarExporter\\": ""
2256
+                },
2257
+                "exclude-from-classmap": [
2258
+                    "/Tests/"
2259
+                ]
2260
+            },
2261
+            "notification-url": "https://packagist.org/downloads/",
2262
+            "license": [
2263
+                "MIT"
2264
+            ],
2265
+            "authors": [
2266
+                {
2267
+                    "name": "Nicolas Grekas",
2268
+                    "email": "p@tchwork.com"
2269
+                },
2270
+                {
2271
+                    "name": "Symfony Community",
2272
+                    "homepage": "https://symfony.com/contributors"
2273
+                }
2274
+            ],
2275
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
2276
+            "homepage": "https://symfony.com",
2277
+            "keywords": [
2278
+                "clone",
2279
+                "construct",
2280
+                "export",
2281
+                "hydrate",
2282
+                "instantiate",
2283
+                "serialize"
2284
+            ],
2285
+            "support": {
2286
+                "source": "https://github.com/symfony/var-exporter/tree/v5.4.32"
2287
+            },
2288
+            "funding": [
2289
+                {
2290
+                    "url": "https://symfony.com/sponsor",
2291
+                    "type": "custom"
2292
+                },
2293
+                {
2294
+                    "url": "https://github.com/fabpot",
2295
+                    "type": "github"
2296
+                },
2297
+                {
2298
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2299
+                    "type": "tidelift"
2300
+                }
2301
+            ],
2302
+            "time": "2023-11-16T19:33:05+00:00"
2303
+        },
2304
+        {
2305
+            "name": "symfony/yaml",
2306
+            "version": "v5.4.31",
2307
+            "source": {
2308
+                "type": "git",
2309
+                "url": "https://github.com/symfony/yaml.git",
2310
+                "reference": "f387675d7f5fc4231f7554baa70681f222f73563"
2311
+            },
2312
+            "dist": {
2313
+                "type": "zip",
2314
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/f387675d7f5fc4231f7554baa70681f222f73563",
2315
+                "reference": "f387675d7f5fc4231f7554baa70681f222f73563",
2316
+                "shasum": ""
2317
+            },
2318
+            "require": {
2319
+                "php": ">=7.2.5",
2320
+                "symfony/deprecation-contracts": "^2.1|^3",
2321
+                "symfony/polyfill-ctype": "^1.8"
2322
+            },
2323
+            "conflict": {
2324
+                "symfony/console": "<5.3"
2325
+            },
2326
+            "require-dev": {
2327
+                "symfony/console": "^5.3|^6.0"
2328
+            },
2329
+            "suggest": {
2330
+                "symfony/console": "For validating YAML files using the lint command"
2331
+            },
2332
+            "bin": [
2333
+                "Resources/bin/yaml-lint"
2334
+            ],
2335
+            "type": "library",
2336
+            "autoload": {
2337
+                "psr-4": {
2338
+                    "Symfony\\Component\\Yaml\\": ""
2339
+                },
2340
+                "exclude-from-classmap": [
2341
+                    "/Tests/"
2342
+                ]
2343
+            },
2344
+            "notification-url": "https://packagist.org/downloads/",
2345
+            "license": [
2346
+                "MIT"
2347
+            ],
2348
+            "authors": [
2349
+                {
2350
+                    "name": "Fabien Potencier",
2351
+                    "email": "fabien@symfony.com"
2352
+                },
2353
+                {
2354
+                    "name": "Symfony Community",
2355
+                    "homepage": "https://symfony.com/contributors"
2356
+                }
2357
+            ],
2358
+            "description": "Loads and dumps YAML files",
2359
+            "homepage": "https://symfony.com",
2360
+            "support": {
2361
+                "source": "https://github.com/symfony/yaml/tree/v5.4.31"
2362
+            },
2363
+            "funding": [
2364
+                {
2365
+                    "url": "https://symfony.com/sponsor",
2366
+                    "type": "custom"
2367
+                },
2368
+                {
2369
+                    "url": "https://github.com/fabpot",
2370
+                    "type": "github"
2371
+                },
2372
+                {
2373
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2374
+                    "type": "tidelift"
2375
+                }
2376
+            ],
2377
+            "time": "2023-11-03T14:41:28+00:00"
2378
+        }
2379
+    ],
2380
+    "aliases": [],
2381
+    "minimum-stability": "dev",
2382
+    "stability-flags": [],
2383
+    "prefer-stable": true,
2384
+    "prefer-lowest": false,
2385
+    "platform": [],
2386
+    "platform-dev": [],
2387
+    "platform-overrides": {
2388
+        "php": "8.0.0"
2389
+    },
2390
+    "plugin-api-version": "2.6.0"
2391
+}
... ...
@@ -6,15 +6,51 @@
6 6
 	<version>1.0</version>
7 7
 	<type>modification</type>
8 8
 
9
+	<install for="3.0 Alpha 1">
10
+		<!-- language files -->
11
+		<require-file name="Language/Hibp.english.php" destination="$themes_dir/default/languages" />
12
+
13
+		<!-- script files -->
14
+		<require-file name="sha1.js" destination="$themes_dir/default/scripts" />
15
+
16
+		<!-- source files -->
17
+		<require-file name="SMF3.0/Hibp.php" destination="$sourcedir" />
18
+
19
+		<!-- All the hooks -->
20
+		<hook hook="integrate_validatePassword" function="hibp::validatePassword" file="$sourcedir/Hibp.php" />
21
+		<hook hook="integrate_setup_profile_context" function="hibp::addToProfileContext" file="$sourcedir/Hibp.php" />
22
+		<hook hook="integrate_load_custom_profile_fields" function="hibp::addToRegistrationPage" file="$sourcedir/Hibp.php" />
23
+		<hook hook="integrate_general_security_settings" function="hibp::addToGeneralSecuritySettings" file="$sourcedir/Hibp.php" />
24
+
25
+		<redirect url="$scripturl?action=admin;area=serversettings;sa=security;$session_var=$session_id" />
26
+	</install>
27
+
28
+	<uninstall for="3.0 Alpha 1">
29
+		<!-- All the hooks, removed -->
30
+		<hook reverse="true" hook="integrate_validatePassword" function="hibp_validatePassword" file="$sourcedir/Hibp.php" />
31
+		<hook reverse="true" hook="integrate_setup_profile_context" function="hibp_setup_profile_context" file="$sourcedir/Hibp.php" />
32
+		<hook reverse="true" hook="integrate_load_custom_profile_fields" function="hibp_load_custom_profile_fields" file="$sourcedir/Hibp.php" />
33
+		<hook reverse="true" hook="integrate_general_security_settings" function="hibp_general_security_settings" file="$sourcedir/Hibp.php" />
34
+
35
+		<!-- script files, removed -->
36
+		<remove-file name="$themes_dir/default/scripts/sha1.js" />
37
+
38
+		<!-- language files, removed -->
39
+		<remove-file name="$themes_dir/default/languages/Hibp.english.php" />
40
+
41
+		<!-- source files, removed -->
42
+		<remove-file name="$sourcedir/Hibp.php" />
43
+	</uninstall>
44
+
9 45
 	<install for="2.1.*">
10 46
 		<!-- language files -->
11
-		<require-file name="language/Hibp.english.php" destination="$themes_dir/default/languages" />
47
+		<require-file name="Language/Hibp.english.php" destination="$themes_dir/default/languages" />
12 48
 
13 49
 		<!-- script files -->
14 50
 		<require-file name="sha1.js" destination="$themes_dir/default/scripts" />
15 51
 
16 52
 		<!-- source files -->
17
-		<require-file name="Hibp.php" destination="$sourcedir" />
53
+		<require-file name="SMF2.1/Hibp.php" destination="$sourcedir" />
18 54
 
19 55
 		<!-- All the hooks -->
20 56
 		<hook hook="integrate_validatePassword" function="hibp_validatePassword" file="$sourcedir/Hibp.php" />
21 57