├── .github
├── FUNDING.yml
└── workflows
│ ├── changelog.yml
│ └── php-version-installation-pipeline.yml
├── file
└── nagad-logo.png
├── .gitignore
├── .env.example
├── src
├── Test
│ ├── Test
│ │ └── phpunit.xml
│ └── Functionality
│ │ └── FeatureTest.php
├── Exception
│ ├── NagadPaymentException.php
│ └── ExceptionHandler.php
├── lib
│ └── Key.php
├── Base.php
├── RequestHandler.php
└── Helper.php
├── composer.json
├── readme.md
├── CHANGELOG.md
└── composer.lock
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://www.buymeacoffee.com/arif98741
2 |
--------------------------------------------------------------------------------
/file/nagad-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arif98741/nagadApi/HEAD/file/nagad-logo.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .phpintel
2 | .idea
3 | .vscode
4 | *.log
5 | *.iml
6 | *.composerLog
7 | *.zip
8 | vendor/
9 | logs/
10 | index.php
11 | .env
12 | works
13 |
14 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | NAGAD_APP_ENV = development
2 | NAGAD_APP_LOG = 1
3 | NAGAD_APP_ACCOUNT =
4 | NAGAD_APP_MERCHANTID =
5 | NAGAD_APP_MERCHANT_PRIVATE_KEY =
6 | NAGAD_APP_MERCHANT_PG_PUBLIC_KEY =
7 | NAGAD_APP_TIMEZONE = Asia/Dhaka
--------------------------------------------------------------------------------
/src/Test/Test/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | /UnitTestFiles/Test/
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/Exception/NagadPaymentException.php:
--------------------------------------------------------------------------------
1 | assertTrue(true);
17 | }
18 |
19 | }
--------------------------------------------------------------------------------
/src/Exception/ExceptionHandler.php:
--------------------------------------------------------------------------------
1 | appEnv;
64 | $data['NAGAD_APP_ACCOUNT'] = $config->appAccount;
65 | $data['NAGAD_APP_MERCHANTID'] = $config->appMerchantID;
66 | $data['NAGAD_APP_MERCHANT_PRIVATE_KEY'] = $config->merchantPrivateKey;
67 | $data['NAGAD_APP_MERCHANT_PG_PUBLIC_KEY'] = $config->pgPublicKey;
68 | $data['NAGAD_APP_TIMEZONE'] = $config->timeZone;
69 | $envData = self::generateEnv($data);
70 |
71 | } else {
72 |
73 | $envData = self::generateEnv($config);
74 | }
75 |
76 | $this->appEnv = $envData['NAGAD_APP_ENV'];
77 | //$this->appAccount = $envData['NAGAD_APP_ACCOUNT'];
78 | $this->appMerchantID = $envData['NAGAD_APP_MERCHANTID'];
79 | $this->merchantPrivateKey = $envData['NAGAD_APP_MERCHANT_PRIVATE_KEY'];
80 | $this->pgPublicKey = $envData['NAGAD_APP_MERCHANT_PG_PUBLIC_KEY'];
81 | if (array_key_exists('NAGAD_APP_TIMEZONE', $envData)) {
82 | $this->timeZone = $envData['NAGAD_APP_TIMEZONE'];
83 | }
84 |
85 | }
86 |
87 | /**
88 | * Return all data inside .env file as array
89 | * @param $config
90 | * @return array
91 | * @since v1.3.1
92 | */
93 | private function generateEnv($config)
94 | {
95 | return $config;
96 | }
97 |
98 | /**
99 | * @return $this
100 | * @since v1.3.1
101 | */
102 | public function getVariables()
103 | {
104 | return $this;
105 | }
106 |
107 | /**
108 | * @return mixed
109 | * @since v1.3.1
110 | */
111 | public function getAppEnv()
112 | {
113 | return $this->appEnv;
114 | }
115 |
116 | /**
117 | * @param mixed $appEnv
118 | * @since v1.3.1
119 | */
120 | public function setAppEnv($appEnv)
121 | {
122 | $this->appEnv = $appEnv;
123 | }
124 |
125 | /**
126 | * @return mixed
127 | * @since v1.3.1
128 | */
129 | public function getAppAccount()
130 | {
131 | return $this->appAccount;
132 | }
133 |
134 | /**
135 | * @param mixed $appAccount
136 | * @since v1.3.1
137 | */
138 | public function setAppAccount($appAccount)
139 | {
140 | $this->appAccount = $appAccount;
141 | }
142 |
143 | /**
144 | * @return mixed
145 | * @since v1.3.1
146 | */
147 | public function getAppMerchantID()
148 | {
149 | return $this->appMerchantID;
150 | }
151 |
152 | /**
153 | * @param mixed $appMerchantID
154 | * @since v1.3.1
155 | */
156 | public function setAppMerchantID($appMerchantID)
157 | {
158 | $this->appMerchantID = $appMerchantID;
159 | }
160 |
161 | /**
162 | * @return mixed
163 | * @since v1.3.1
164 | */
165 | public function getMerchantPrivateKey()
166 | {
167 | return $this->merchantPrivateKey;
168 | }
169 |
170 | /**
171 | * @param mixed $merchantPrivateKey
172 | * @since v1.3.1
173 | */
174 | public function setMerchantPrivateKey($merchantPrivateKey)
175 | {
176 | $this->merchantPrivateKey = $merchantPrivateKey;
177 | }
178 |
179 | /**
180 | * @return mixed
181 | * @since v1.3.1
182 | */
183 | public function getPgPublicKey()
184 | {
185 | return $this->pgPublicKey;
186 | }
187 |
188 | /**
189 | * @param mixed $pgPublicKey
190 | * @since v1.3.1
191 | */
192 | public function setPgPublicKey($pgPublicKey)
193 | {
194 | $this->pgPublicKey = $pgPublicKey;
195 | }
196 |
197 | /**
198 | * @return string
199 | * @since v1.3.1
200 | */
201 | public function getCurrencyCode()
202 | {
203 | return $this->currencyCode;
204 | }
205 |
206 | /**
207 | * @return mixed
208 | * @since v1.3.1
209 | */
210 | public function getTimeZone()
211 | {
212 | return $this->timeZone;
213 | }
214 |
215 | /**
216 | * @param mixed $timeZone
217 | * @since v1.3.1
218 | */
219 | public function setTimeZone($timeZone)
220 | {
221 | $this->timeZone = $timeZone;
222 | }
223 |
224 | }
225 |
--------------------------------------------------------------------------------
/src/Base.php:
--------------------------------------------------------------------------------
1 | checkParams($config, $params);
75 | $this->keyObject = new Key($config);
76 | $this->amount = $params['amount'];
77 | $this->invoice = $params['invoice'];
78 | $this->merchantID = $this->keyObject->getAppMerchantID();
79 | $this->merchantCallback = $params['merchantCallback'];
80 | $this->setTimeZone($this->keyObject->getTimeZone());
81 | date_default_timezone_set($this->timezone);
82 |
83 | /**
84 | * Before activating production environment be confirm that your system is ok and out of bug
85 | * it is highly recommended to Test your environment using development environment
86 | * your ip,domain and callback_url should be whitelisted in Nagad end
87 | */
88 | if ($this->keyObject->getAppEnv() == 'production') {
89 | $this->base_url = 'https://api.mynagad.com/api/dfs/';
90 | $this->environment = $this->keyObject->getAppEnv();
91 | }
92 |
93 | }
94 |
95 | /**
96 | * Final Send Request to Nagad
97 | * @param Base $base
98 | * @return array
99 | * @throws Exception
100 | * @since v1.6.0
101 | */
102 | public function payNow(Base $base)
103 | {
104 | return (new RequestHandler($base))->sendRequest();
105 | }
106 |
107 | /**
108 | * Final Send Request to Nagad and Get Redirection Url
109 | * @param Base $base
110 | * @return string
111 | * @throws Exception
112 | * @since v1.6.0
113 | */
114 | public function payNowWithoutRedirection(Base $base)
115 | {
116 | return (new RequestHandler($base))->sendRequest(false);
117 | }
118 |
119 | /**
120 | * @return string
121 | * @since v1.3.1
122 | */
123 | public function getTimezone(): string
124 | {
125 | return $this->timezone;
126 | }
127 |
128 | /**
129 | * @param $timeZone
130 | * @since v1.3.1
131 | */
132 | public function setTimeZone($timeZone)
133 | {
134 | if (!empty($timeZone)) {
135 | $this->timezone = $timeZone;
136 | } else {
137 | $this->timezone = 'Asia/Dhaka';
138 | }
139 |
140 | }
141 |
142 | /**
143 | * @return mixed
144 | * @since v1.3.1
145 | */
146 | public function getAmount()
147 | {
148 | return $this->amount;
149 | }
150 |
151 | /**
152 | * @return mixed
153 | * @since v1.3.1
154 | */
155 | public function getInvoice()
156 | {
157 | return $this->invoice;
158 | }
159 |
160 | /**
161 | * @return mixed
162 | * @since v1.3.1
163 | */
164 | public function getMerchantID()
165 | {
166 | return $this->merchantID;
167 | }
168 |
169 | /**
170 | * @return string
171 | * @since v1.3.1
172 | */
173 | public function getBaseUrl(): string
174 | {
175 | return $this->base_url;
176 | }
177 |
178 | /**
179 | * @throws NagadPaymentException
180 | */
181 | private function checkParams($config, $params)
182 | {
183 | if (!is_array($config)) {
184 | throw new NagadPaymentException("Configuration should be array.");
185 | }
186 |
187 | if (!is_array($params)) {
188 | throw new NagadPaymentException("Params should be array.");
189 | }
190 |
191 | if (!array_key_exists('amount', $params)) {
192 | throw new NagadPaymentException("Array key amount missing. Check configuration array format from github repository's readme.md file");
193 | }
194 | if (!array_key_exists('invoice', $params)) {
195 | throw new NagadPaymentException("Array key invoice missing. Check configuration array format from github repository's readme.md file");
196 | }
197 | if (!array_key_exists('merchantCallback', $params)) {
198 | throw new NagadPaymentException("Array key merchantCallback missing. Check configuration array format from github repository's readme.md file");
199 | }
200 | }
201 |
202 | }
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 |

2 |
3 | # Xenon/NagadApi
4 |
5 |
6 | ## Features
7 |
8 | - Easy Installation
9 | - Easy Payment Processing
10 | - Composer based installation
11 | - Verify Payment
12 | - Demo Invoice Code Generate
13 |
14 | # Install Using Composer
15 |
16 | ```bash
17 | composer require xenon/nagad-api
18 | ```
19 |
20 |
21 |
22 | # Example Code
23 | ```php
24 | 'development', // development|production
40 | 'NAGAD_APP_LOG' => '1',
41 | 'NAGAD_APP_MERCHANTID' => '6800000025', //demo
42 | 'NAGAD_APP_MERCHANT_PRIVATE_KEY' => 'MIIEvFAAxN1qfKiRiCL720FtQfIwPDp9ZqbG2OQbdyZUB8I08irKJ0x/psM4SjXasglHBK5G1DX7BmwcB/PRbC0cHYy3pXDmLI8pZl1NehLzbav0Y4fP4MdnpQnfzZJdpaGVE0oI15l',
43 | 'NAGAD_APP_MERCHANT_PG_PUBLIC_KEY' => 'MIIBIjANBc54jjMJoP2toR9fGmQV7y9fzj',
44 | 'NAGAD_APP_TIMEZONE' => 'Asia/Dhaka',
45 | ];
46 |
47 | $nagad = new Base($config, [
48 | 'amount' => 10,
49 | 'invoice' => Helper::generateFakeInvoice(15, true),
50 | 'merchantCallback' => 'https://example.com/payment/success/id=4',
51 | ]);
52 | ```
53 |
54 | ## Method-1 **:** Use for website
55 | ```
56 | $status = $nagad->payNow($nagad); //will redirect to payment page
57 | ```
58 |
59 | ## Method-2 **:** Return Redirection url . You can use this according to need
60 | ```
61 | $paymentUrl = $nagad->payNowWithoutRedirection($nagad); //will return payment url like below. You can use that url and do whatever u want to get payment from clients.
62 | ```
63 |
64 |
65 | ```
66 | http://sandbox.mynagad.com:10060/check-out/MDYyODAwNTcyNTYxNi42ODMwMDIwMDcxMDQyMjUuOU5PTEFVNkVaWkdUWVRBLmJiZGMyNTE3MTVmZTNiNjIzN2Zk
67 | ```
68 |
69 | ### After that use below method for extracting payment response that will return an array
70 |
71 | ```
72 | $successUrl = 'https://example.com/payment/success/id=4/?merchant=683XXXX225&order_id=CKH060JXXXXXFRA2&payment_ref_id=MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=&status=Success&status_code=00_0000_000&message=Successful%20Transaction&payment_dt=20211123235008&issuer_payment_ref=MTEyMzIzNDg1NzUwOS42ODMwMDIwMDcxMDQyMjUuQ0tIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=';
73 | $response = Helper::successResponse("$successUrl");
74 |
75 | Array
76 | (
77 | [merchant] => 683XXXX225
78 | [order_id] => CKH060JXXXXXFRA2
79 | [payment_ref_id] => MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=
80 | [status] => Success
81 | [status_code] => 00_0000_000
82 | [message] => Successful Transaction
83 | [payment_dt] => 20211123235008
84 | [issuer_payment_ref] => MTEyMzIzNDg1NzUwOXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=
85 | )
86 | ```
87 | ### For payment verification use below method. You will then get below json as response.
88 | ```
89 | $helper = new Helper($config);
90 | $response = $helper->verifyPayment($response['payment_ref_id']);
91 | ```
92 |
93 | ## Payment Verification Response
94 | ```
95 | {
96 | merchantId: "683XXXX225",
97 | orderId: "CKH060JXXXXXFRA2",
98 | paymentRefId: "MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=",
99 | amount: "16",
100 | clientMobileNo: "016****5428",
101 | merchantMobileNo: "01XXXXXXX10",
102 | orderDateTime: "2021-11-23 23:48:22.0",
103 | issuerPaymentDateTime: "2021-11-23 23:50:08.0",
104 | issuerPaymentRefNo: "000XXXW",
105 | additionalMerchantInfo: null,
106 | status: "Success",
107 | statusCode: "000",
108 | cancelIssuerDateTime: null,
109 | cancelIssuerRefNo: null
110 | }
111 | ```
112 | ## Maintainer
113 |
116 |
117 |
118 | ### Contributors
119 |
122 |
123 |
124 |
125 | # Important Information:
126 |
127 | ### Sandbox Environment
128 | 1. Need sandbox details for sandbox testing. Check your email that you have got from nagad authority
129 | 2. Use sandbox details such as pgpublickey, privatekey, merchant-id for sandbox testing
130 | 3. You need to register a mobile number for sandbox testing. Contact with your account manager for doing this
131 | 4. You should test environment before going to live
132 |
133 |
134 | ### Live Environment
135 | 1. Need production details for production final. You will get through email
136 | 2. Your server ip/domain and callback url should be whitelisted before running in production. You can contact with nagad team using mail or other system
137 |
138 | Login to your **Nagad Merchant Panel**
139 |
140 | ` https://auth.mynagad.com:10900/authentication-service-provider-1.0/login
141 | `
142 |
143 | **Step 1:**
144 | **_In the Merchant Portal, Go to Merchant Integration Details under Merchant Management Menu.
145 | You will get the Merchant ID which is your Merchant ID for Integration._**
146 |
147 | Then, Click on “Key Generate” and
148 | Download the Merchant Private Key and Merchant Public Key.
149 |
150 | **Step 2:**
151 | _**_Go to Merchant Integration under Merchant Management Menu.
152 | Put your Call Back URL and Upload the Merchant Public Key which you have downloaded in Step 1. Add and Submit!**__
153 |
154 | **Step 3:**
155 | _**_Usage Production Details .
156 | You have to use public key and private key that you have downloaded!**__
157 |
158 |
159 | 3. If you have any question/query then email me **arif98741@gmail.com**
160 | 4. Do Code, Be Crazy
161 |
162 | ### If you find any kind of issue or bug you are highly encouraged to report. For reporting use [issues option](https://github.com/arif98741/nagadApi/issues)
163 | For can also add pull request. For pull request you should use **dev** branch. Because our **master** branch is serving at this moment for usage around community. We dont want to messup
164 |
165 |
166 | ## License
167 |
168 | [MIT](https://choosealicense.com/licenses/mit/)
169 |
170 |
--------------------------------------------------------------------------------
/src/RequestHandler.php:
--------------------------------------------------------------------------------
1 | base = $base;
56 | $this->helper = new Helper($this->base->keyObject);
57 | }
58 |
59 | /**
60 | * Fire request to nagad api
61 | * @return mixed
62 | * @throws Exception
63 | * @since v1.6.0
64 | */
65 | public function sendRequest(bool $redirection = true)
66 | {
67 | $postUrl = $this->base->getBaseUrl() . $this->apiUrl
68 | . $this->base->getMerchantID() .
69 | "/" . $this->base->getInvoice();
70 |
71 | $sensitiveData = array(
72 | 'merchantId' => $this->base->keyObject->getAppMerchantID(),
73 | 'datetime' => Date('YmdHis'),
74 | 'orderId' => $this->base->getInvoice(),
75 | 'challenge' => Helper::generateRandomString(40, 'you', 'me')
76 | );
77 |
78 |
79 | try {
80 | $publicSignature = $this->helper->encryptDataWithPublicKey(json_encode($sensitiveData));
81 | } catch (Exception $e) {
82 |
83 | throw new ExceptionHandler($e->getMessage());
84 |
85 | }
86 |
87 | try {
88 | $signature = $this->helper->signatureGenerate(json_encode($sensitiveData));
89 | } catch (Exception $e) {
90 | throw new ExceptionHandler($e->getMessage());
91 |
92 | }
93 |
94 | $postData = array(
95 | 'accountNumber' => $this->base->keyObject->getAppAccount(), //optional
96 | 'dateTime' => Date('YmdHis'),
97 | 'sensitiveData' => $publicSignature,
98 | 'signature' => $signature
99 | );
100 |
101 | $resultData = $this->helper->httpPostMethod($postUrl, $postData);
102 |
103 | if (!is_array($resultData)) {
104 | throw new ExceptionHandler("Failed to generate nagad payment url as it is returning null response from nagad api server. Please be confirm that you have whitelisted your server ip or fix other server ip related issue. Sometimes it happens if your hosting server is located outside Bangladesh. Contact with Nagad authority for assistance with your support ticket id");
105 | }
106 |
107 | if (array_key_exists('error', $resultData)) {
108 | throw new ExceptionHandler($resultData['error']);
109 | }
110 |
111 | if (array_key_exists('reason', $resultData)) {
112 |
113 | throw new ExceptionHandler( $resultData['message']);
114 | }
115 |
116 |
117 | //check existence of sensitiveData and signature
118 | if (array_key_exists('sensitiveData', $resultData) && array_key_exists('signature', $resultData)) {
119 |
120 | if (!empty($resultData['sensitiveData']) && !empty($resultData['signature'])) {
121 | $plainResponse = json_decode($this->helper->decryptDataWithPrivateKey($resultData['sensitiveData']), true);
122 | if (isset($plainResponse['paymentReferenceId'], $plainResponse['challenge'])) {
123 |
124 | $paymentReferenceId = $plainResponse['paymentReferenceId'];
125 | $challenge = $plainResponse['challenge'];
126 |
127 | $sensitiveDataOrder = array(
128 | 'merchantId' => $this->base->getMerchantID(),
129 | 'orderId' => $this->base->getInvoice(),
130 | 'currencyCode' => $this->base->keyObject->getCurrencyCode(),
131 | 'amount' => $this->base->getAmount(),
132 | 'challenge' => $challenge
133 | );
134 |
135 | $postDataOrder = array(
136 | 'sensitiveData' => $this->helper->encryptDataWithPublicKey(json_encode($sensitiveDataOrder)),
137 | 'signature' => $this->helper->signatureGenerate(json_encode($sensitiveDataOrder)),
138 | 'merchantCallbackURL' => $this->base->merchantCallback,
139 |
140 | );
141 | $OrderSubmitUrl = $this->base->getBaseUrl() . "check-out/complete/"
142 | . $paymentReferenceId;
143 |
144 | $resultDataOrder = $this->helper->httpPostMethod($OrderSubmitUrl, $postDataOrder);
145 |
146 | if (array_key_exists('status', $resultDataOrder)) {
147 |
148 | if ($resultDataOrder['status'] == "Success" && $redirection) {
149 | $url = json_encode($resultDataOrder['callBackUrl']);
150 | echo "";
151 | exit;
152 | }
153 |
154 | if ($resultDataOrder['status'] == "Success" && !$redirection) {
155 |
156 | return $resultDataOrder['callBackUrl'];
157 | }
158 |
159 | echo json_encode($resultDataOrder);
160 |
161 | } else {
162 | return $resultDataOrder;
163 | }
164 |
165 | }
166 | }
167 | } else {
168 | $this->showResponse($resultData['message'], [], []);
169 | }
170 | }
171 |
172 | /**
173 | * @param $resultData
174 | * @param $sensitiveData
175 | * @param $postData
176 | * @return void
177 | * @since v1.8.4.4
178 | */
179 | private function showResponse($resultData, $sensitiveData, $postData)
180 | {
181 | $this->response = [
182 | 'status' => 'error',
183 | 'response' => $resultData,
184 | 'request' => [
185 | 'environment' => $this->base->environment,
186 | 'time' => [
187 | 'request time' => Carbon::now(),
188 | 'timezone' => $this->base->getTimezone()
189 | ],
190 | 'url' => [
191 | 'base_url' => $this->base->getBaseUrl(),
192 | 'api_url' => $this->apiUrl,
193 | 'request_url' => $this->base->getBaseUrl() . $this->apiUrl,
194 | ],
195 | 'data' => [
196 | 'sensitiveData' => $sensitiveData,
197 | 'postData' => $postData
198 | ],
199 |
200 | ],
201 | 'server' => Helper::serverDetails()
202 | ];
203 | }
204 |
205 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # CHANGELOG
2 |
3 | ## [v1.9.4.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.4.0) - 2025-01-29 04:30:42+00:00
4 |
5 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.3.0...v1.9.4.0
6 |
7 | ## [v1.9.3.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.3.0) - 2025-01-29 04:27:41
8 |
9 | ## What's Changed
10 | * PHP Version Pipeline Check by @arif98741 in https://github.com/arif98741/nagadApi/pull/9
11 | * Merge Dev to Master by @arif98741 in https://github.com/arif98741/nagadApi/pull/10
12 |
13 |
14 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.4...v1.9.3.0
15 |
16 | ## [v1.9.2.4](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.4) - 2024-12-15 05:46:05
17 |
18 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.3...v1.9.2.4
19 |
20 | ## [v1.9.2.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.3) - 2023-06-07 17:35:22
21 |
22 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.2...v1.9.2.3
23 |
24 | ## [v1.9.2.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.2) - 2023-04-07 18:06:41
25 |
26 | *No description*
27 |
28 | ## [v1.9.2.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.1) - 2023-04-07 18:04:36
29 |
30 | ## [v1.9.2.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.0) - 2023-01-08 07:35:21
31 |
32 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.9...v1.9.2.0
33 |
34 | ## [v1.9.1.9](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.9) - 2023-01-08 07:04:36
35 |
36 | Keywords added, added more specified response message
37 |
38 | ## [v1.9.1.8](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.8) - 2022-12-20 07:16:47
39 |
40 | fix conflicts
41 |
42 | ### Bug Fixes
43 |
44 | - general:
45 | - fix conflicts ([e764eff](https://github.com/arif98741/nagadApi/commit/e764eff970af61d791d81c830b7abd073d06a10a)) ([#5](https://github.com/arif98741/nagadApi/pull/5))
46 |
47 | ## [v1.9.1.7](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.7) - 2022-11-08 07:16:11
48 |
49 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.6...v1.9.1.7
50 |
51 | ## [v1.9.1.6](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.6) - 2022-08-24 12:17:00
52 |
53 | *No description*
54 |
55 | ## [v1.9.1.4](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.4) - 2022-08-16 18:30:02
56 |
57 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.2...v1.9.1.4
58 |
59 | ## [v1.9.1.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.3) - 2022-07-04 06:18:43
60 |
61 | *No description*
62 |
63 | ## [v1.9.1.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.2) - 2022-07-03 18:39:52
64 |
65 | *No description*
66 |
67 | ## [v1.9.1.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.1) - 2022-06-27 19:10:49
68 |
69 | *No description*
70 |
71 | ### Bug Fixes
72 |
73 | - general:
74 | - fix ([a61e64d](https://github.com/arif98741/nagadApi/commit/a61e64d4262fd26c0a5fb04cedba965a4e54e3a3))
75 |
76 | ## [v1.9.1.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.0) - 2022-06-27 19:06:30
77 |
78 | 1. Added new method
79 | 2. Fix php unit dependency
80 | 3. Add php 8 support
81 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.0.3...v1.9.1.0
82 |
83 | ## [v1.9.0.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.3) - 2021-11-23 18:32:52
84 |
85 | *No description*
86 |
87 | ## [v1.9.0.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.2) - 2021-11-08 04:57:34
88 |
89 | *No description*
90 |
91 | ## [v1.9.0.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.1) - 2021-11-07 16:31:46
92 |
93 | *No description*
94 |
95 | ### Bug Fixes
96 |
97 | - general:
98 | - fix class not found issue ([30a3a79](https://github.com/arif98741/nagadApi/commit/30a3a792caf9099e95cd0b35c4bfef8928f278d9))
99 |
100 | ## [v1.9.0.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.0) - 2021-10-24 04:45:13
101 |
102 | *No description*
103 |
104 | ## [v1.8.4.8](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.8) - 2021-10-23 12:04:16
105 |
106 | 1. Add Exception Handler
107 | 2. Added PHP 8.* support
108 | 3. Optimized Code
109 | 4. Changed some comments
110 |
111 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.8.3...v1.8.4.8
112 |
113 | ## [v1.8.4.6](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.6) - 2021-10-23 10:23:41
114 |
115 | *No description*
116 |
117 | ## [v1.8.4.5](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.5) - 2021-05-02 21:17:35
118 |
119 | *No description*
120 |
121 | ## [v1.8.4.4](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.4) - 2021-05-02 20:58:32
122 |
123 | *No description*
124 |
125 | ## [v1.8.4.3](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.3) - 2021-03-08 20:24:03
126 |
127 | *No description*
128 |
129 | ### Bug Fixes
130 |
131 | - general:
132 | - fix conflicts ([8bd1b3e](https://github.com/arif98741/nagadApi/commit/8bd1b3ea515d8d56e8db7000a0769258a7b5245d))
133 | - fix error code ([b523678](https://github.com/arif98741/nagadApi/commit/b523678aa34fc8101c8c63b2b0171acb578896b1))
134 |
135 | ## [v1.8.4.2](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.2) - 2021-03-08 20:00:32
136 |
137 | fix error message and exception
138 |
139 | ## [v1.8.4.1](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.1) - 2021-03-08 19:07:38
140 |
141 | *No description*
142 |
143 | ## [v1.8.3](https://github.com/arif98741/nagadApi/releases/tag/v1.8.3) - 2021-03-07 08:30:20
144 |
145 | *No description*
146 |
147 | ## [v1.8.2](https://github.com/arif98741/nagadApi/releases/tag/v1.8.2) - 2021-03-07 07:35:15
148 |
149 | fix minor error
150 | remove debug error
151 | reduce code structure
152 | added exceptionhandler
153 |
154 | ## [v1.8.0](https://github.com/arif98741/nagadApi/releases/tag/v1.8.0) - 2021-03-07 07:29:26
155 |
156 | *No description*
157 |
158 | ## [v1.6.7](https://github.com/arif98741/nagadApi/releases/tag/v1.6.7) - 2020-11-28 19:01:00
159 |
160 | *No description*
161 |
162 | ## [v1.6.6](https://github.com/arif98741/nagadApi/releases/tag/v1.6.6) - 2020-11-12 04:41:42
163 |
164 | *No description*
165 |
166 | ## [v1.6.5](https://github.com/arif98741/nagadApi/releases/tag/v1.6.5) - 2020-11-11 19:23:50
167 |
168 | *No description*
169 |
170 | ## [v1.6.4](https://github.com/arif98741/nagadApi/releases/tag/v1.6.4) - 2020-11-11 17:50:45
171 |
172 | *No description*
173 |
174 | ## [v1.6.3](https://github.com/arif98741/nagadApi/releases/tag/v1.6.3) - 2020-11-11 09:18:53
175 |
176 | *No description*
177 |
178 | ## [v1.6.0](https://github.com/arif98741/nagadApi/releases/tag/v1.6.0) - 2020-11-11 07:47:27
179 |
180 | *No description*
181 |
182 | ## [v1.5.9](https://github.com/arif98741/nagadApi/releases/tag/v1.5.9) - 2020-11-11 01:52:56
183 |
184 | This is final version and latest release
185 |
186 | ### Bug Fixes
187 |
188 | - general:
189 | - fix conflicts ([7c5ded4](https://github.com/arif98741/nagadApi/commit/7c5ded44a46f7d40a1825c57971dd5c1b2a3a945))
190 |
191 | ## [v1.5.2](https://github.com/arif98741/nagadApi/releases/tag/v1.5.2) - 2020-11-11 00:55:44
192 |
193 | *No description*
194 |
195 | ## [v1.5.1](https://github.com/arif98741/nagadApi/releases/tag/v1.5.1) - 2020-11-11 00:47:41
196 |
197 | v1.5.1
198 |
199 | ## [v1.5.0](https://github.com/arif98741/nagadApi/releases/tag/v1.5.0) - 2020-11-11 00:44:50
200 |
201 | *No description*
202 |
203 | ## [v0.1.5_alpha](https://github.com/arif98741/nagadApi/releases/tag/v0.1.5_alpha) - 2020-11-11 00:34:28
204 |
205 | *No description*
206 |
207 | ### Bug Fixes
208 |
209 | - general:
210 | - fix error and modified for publish ([ed9d5ff](https://github.com/arif98741/nagadApi/commit/ed9d5ffb5134a8d4fc66d936fc54f711086b01f9))
211 |
212 | ## [v0.0.1_alpha](https://github.com/arif98741/nagadApi/releases/tag/v0.0.1_alpha) - 2020-10-02 21:30:29
213 |
214 | Pre release of alpha. More testing should be added and live url should also tested.
215 |
216 | \* *This CHANGELOG was automatically generated by [auto-generate-changelog](https://github.com/BobAnkh/auto-generate-changelog)*
217 |
--------------------------------------------------------------------------------
/src/Helper.php:
--------------------------------------------------------------------------------
1 | getPgPublicKey() . "\n-----END PUBLIC KEY-----";
72 | $keyResource = openssl_get_publickey($publicKey);
73 | $status = openssl_public_encrypt($data, $cryptoText, $keyResource);
74 | if ($status) {
75 | return base64_encode($cryptoText);
76 | }
77 |
78 | throw new ExceptionHandler('Invalid Public key. Check Public Key in Configuration');
79 | }
80 |
81 | /**
82 | * Generate Signature
83 | * @param $data
84 | * @return string
85 | * @throws ExceptionHandler
86 | * @since v1.3.1
87 | */
88 | public function signatureGenerate($data): string
89 | {
90 | $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->getMerchantPrivateKey() . "\n-----END RSA PRIVATE KEY-----";
91 | $status = openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
92 | if ($status) {
93 |
94 | return base64_encode($signature);
95 | }
96 |
97 | throw new ExceptionHandler('Invalid private key. Check Private Key in Configuration');
98 | }
99 |
100 | /**
101 | * @param string $postUrl
102 | * @param array $postData
103 | * @return array|mixed
104 | * @since v1.3.1
105 | */
106 | public function httpPostMethod(string $postUrl, array $postData)
107 | {
108 | $url = curl_init($postUrl);
109 | $postToken = json_encode($postData);
110 | $header = array(
111 | 'Content-Type:application/json',
112 | 'X-KM-Api-Version:v-0.2.0',
113 | 'X-KM-IP-V4:' . $this->getClientIP(),
114 | 'X-KM-Client-Type:PC_WEB'
115 | );
116 |
117 | curl_setopt($url, CURLOPT_HTTPHEADER, $header);
118 | curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST");
119 | curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
120 | curl_setopt($url, CURLOPT_POSTFIELDS, $postToken);
121 | curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1);
122 | curl_setopt($url, CURLOPT_SSL_VERIFYHOST, 0);
123 | curl_setopt($url, CURLOPT_SSL_VERIFYPEER, 0);
124 | $resultData = curl_exec($url);
125 | $curl_error = curl_error($url);
126 |
127 | if (!empty($curl_error)) {
128 | return [
129 | 'error' => $curl_error
130 | ];
131 | }
132 |
133 | $response = json_decode($resultData, true);
134 | curl_close($url);
135 | return $response;
136 | }
137 |
138 |
139 | /**
140 | * Http Get Method
141 | * @param $url
142 | * @return bool|string
143 | * @throws Exception
144 | */
145 | public static function httpGet($url)
146 | {
147 | $ch = curl_init();
148 | $timeout = 10;
149 | curl_setopt($ch, CURLOPT_URL, $url);
150 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
151 | curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
152 | curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/0 (Windows; U; Windows NT 0; zh-CN; rv:3)");
153 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
154 | curl_setopt($ch, CURLOPT_HEADER, 0);
155 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
156 |
157 | $response = curl_exec($ch);
158 | if (curl_errno($ch)) {
159 | $error_msg = curl_error($ch);
160 | throw new NagadPaymentException($error_msg);
161 | }
162 |
163 | curl_close($ch);
164 | return $response;
165 | }
166 |
167 | /**
168 | * Get Client IP | Example : Public IP: 121.23.48.96. 185.96.85.256
169 | * (above ips are for just example)
170 | * @return mixed|string
171 | * @since v1.3.1
172 | */
173 | public function getClientIP()
174 | {
175 | if (isset($_SERVER['HTTP_CLIENT_IP'])) {
176 | $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
177 | } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
178 | $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
179 | } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
180 | $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
181 | } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
182 | $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
183 | } elseif (isset($_SERVER['HTTP_FORWARDED'])) {
184 | $ipaddress = $_SERVER['HTTP_FORWARDED'];
185 | } elseif (isset($_SERVER['REMOTE_ADDR'])) {
186 | $ipaddress = $_SERVER['REMOTE_ADDR'];
187 | } else {
188 | $ipaddress = 'UNKNOWN IP';
189 | }
190 | return $ipaddress;
191 | }
192 |
193 | /**
194 | * @param $cryptoText
195 | * @return string
196 | * @since v1.3.1
197 | */
198 | public function decryptDataWithPrivateKey($cryptoText)
199 | {
200 | $private_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->getMerchantPrivateKey() . "\n-----END RSA PRIVATE KEY-----";
201 | openssl_private_decrypt(base64_decode($cryptoText), $plain_text, $private_key);
202 | return $plain_text;
203 | }
204 |
205 |
206 | /**
207 | * Generate Random Invoice For Testing Purpose
208 | * You Can also use it for making production
209 | * @param int $length
210 | * @param bool $capitalize
211 | * @param string $prefix
212 | * @param string $suffix
213 | * @return string
214 | * @since v1.3.1
215 | */
216 | public static function generateFakeInvoice(int $length = 20, bool $capitalize = false, string $prefix = '', string $suffix = ''): string
217 | {
218 | $invoice = $prefix . self::generateRandomString($length) . $suffix;
219 | if ($capitalize === true) {
220 | $invoice = strtoupper($invoice);
221 | }
222 | return $invoice;
223 | }
224 |
225 | /**
226 | * @param $data
227 | * @since v1.3.1
228 | */
229 | public static function errorLog($data)
230 | {
231 | if (!file_exists('logs/nagadApi') && !mkdir('logs', 0775) && !is_dir('logs')) {
232 | throw new RuntimeException(sprintf('Directory "%s" was not created', 'logs'));
233 | }
234 |
235 | $errorLogFile = 'logs/nagadApi/error.log';
236 | if (!file_exists($errorLogFile)) {
237 |
238 | $logFile = "logs/error.log";
239 | $fh = fopen($logFile, 'w+') or die("can't open file");
240 | fclose($fh);
241 | chmod($logFile, 0755);
242 | }
243 | $date = '=====================' . date('Y-m-d H:i:s') . '=============================================\n';
244 | file_put_contents($errorLogFile, print_r($date, true), FILE_APPEND);
245 | file_put_contents($errorLogFile, PHP_EOL . print_r($data, true), FILE_APPEND);
246 | $string = '=====================' . date('Y-m-d H:i:s') . '=============================================' . PHP_EOL;
247 | file_put_contents($errorLogFile, print_r($string, true), FILE_APPEND);
248 | }
249 |
250 | /**
251 | * Generate Server Details And Return Response
252 | * @return array
253 | * @since v1.3.1
254 | */
255 | public static function serverDetails(): array
256 | {
257 | return [
258 | 'base' => $_SERVER['SERVER_ADDR'],
259 | 'ip' => $_SERVER['REMOTE_ADDR'],
260 | 'port' => $_SERVER['REMOTE_PORT'],
261 | 'request_url' => $_SERVER['REQUEST_URI'],
262 | 'user agent' => $_SERVER['HTTP_USER_AGENT'],
263 | ];
264 | }
265 |
266 | /**
267 | * This is for formatting and getting returning response data from url;
268 | * @param $response
269 | * @return array
270 | * @since v1.3.1
271 | */
272 | public static function successResponse($response)
273 | {
274 | // $response = 'https://example.com/payment/success/id=4/?merchant=683002007104225&order_id=EBSXGJ5OYQCRO7D&
275 | //payment_ref_id=MTEyOTAwMjY1NDMxNi42ODMwMDIwMDcxMDQyMjUuRUJTWEdKNU9ZUUNSTzdELmExODVkYWE4MDAyMDEyM2ZlYzRl&
276 | //status=Success&status_code=00_0000_000&message=Successful%20Transaction&payment_dt=20201129002747&
277 | //issuer_payment_ref=MTEyOTAwMjY1NDMxNi42ODMwMDIwMDcxMDQyMjUuRUJTWEdKNU9ZUUNSTzdELmExODVkYWE4MDAyMDEyM2ZlYzRl';
278 | $parts = parse_url($response);
279 | parse_str($parts['query'], $query);
280 | return $query;
281 | }
282 |
283 | /**
284 | * Verify Payment
285 | * @throws Exception
286 | */
287 | public function verifyPayment($paymentRefId)
288 | {
289 | $this->base_url = 'http://sandbox.mynagad.com:10080/remote-payment-gateway-1.0/api/dfs/';
290 | if ($this->getAppEnv() === 'production') {
291 | $this->base_url = 'https://api.mynagad.com/api/dfs/';
292 | }
293 |
294 | $url = $this->base_url . 'verify/payment/' . $paymentRefId;
295 |
296 | return self::httpGet($url);
297 | }
298 |
299 | }
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
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": "1f0aa48de123603f61fbce61a33b4e59",
8 | "packages": [
9 | {
10 | "name": "nesbot/carbon",
11 | "version": "2.65.0",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/briannesbitt/Carbon.git",
15 | "reference": "09acf64155c16dc6f580f36569ae89344e9734a3"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3",
20 | "reference": "09acf64155c16dc6f580f36569ae89344e9734a3",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "ext-json": "*",
25 | "php": "^7.1.8 || ^8.0",
26 | "symfony/polyfill-mbstring": "^1.0",
27 | "symfony/polyfill-php80": "^1.16",
28 | "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
29 | },
30 | "require-dev": {
31 | "doctrine/dbal": "^2.0 || ^3.1.4",
32 | "doctrine/orm": "^2.7",
33 | "friendsofphp/php-cs-fixer": "^3.0",
34 | "kylekatarnls/multi-tester": "^2.0",
35 | "ondrejmirtes/better-reflection": "*",
36 | "phpmd/phpmd": "^2.9",
37 | "phpstan/extension-installer": "^1.0",
38 | "phpstan/phpstan": "^0.12.99 || ^1.7.14",
39 | "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
40 | "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
41 | "squizlabs/php_codesniffer": "^3.4"
42 | },
43 | "bin": [
44 | "bin/carbon"
45 | ],
46 | "type": "library",
47 | "extra": {
48 | "branch-alias": {
49 | "dev-3.x": "3.x-dev",
50 | "dev-master": "2.x-dev"
51 | },
52 | "laravel": {
53 | "providers": [
54 | "Carbon\\Laravel\\ServiceProvider"
55 | ]
56 | },
57 | "phpstan": {
58 | "includes": [
59 | "extension.neon"
60 | ]
61 | }
62 | },
63 | "autoload": {
64 | "psr-4": {
65 | "Carbon\\": "src/Carbon/"
66 | }
67 | },
68 | "notification-url": "https://packagist.org/downloads/",
69 | "license": [
70 | "MIT"
71 | ],
72 | "authors": [
73 | {
74 | "name": "Brian Nesbitt",
75 | "email": "brian@nesbot.com",
76 | "homepage": "https://markido.com"
77 | },
78 | {
79 | "name": "kylekatarnls",
80 | "homepage": "https://github.com/kylekatarnls"
81 | }
82 | ],
83 | "description": "An API extension for DateTime that supports 281 different languages.",
84 | "homepage": "https://carbon.nesbot.com",
85 | "keywords": [
86 | "date",
87 | "datetime",
88 | "time"
89 | ],
90 | "support": {
91 | "docs": "https://carbon.nesbot.com/docs",
92 | "issues": "https://github.com/briannesbitt/Carbon/issues",
93 | "source": "https://github.com/briannesbitt/Carbon"
94 | },
95 | "funding": [
96 | {
97 | "url": "https://github.com/sponsors/kylekatarnls",
98 | "type": "github"
99 | },
100 | {
101 | "url": "https://opencollective.com/Carbon#sponsor",
102 | "type": "opencollective"
103 | },
104 | {
105 | "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
106 | "type": "tidelift"
107 | }
108 | ],
109 | "time": "2023-01-06T15:55:01+00:00"
110 | },
111 | {
112 | "name": "symfony/deprecation-contracts",
113 | "version": "v2.5.2",
114 | "source": {
115 | "type": "git",
116 | "url": "https://github.com/symfony/deprecation-contracts.git",
117 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
118 | },
119 | "dist": {
120 | "type": "zip",
121 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
122 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
123 | "shasum": ""
124 | },
125 | "require": {
126 | "php": ">=7.1"
127 | },
128 | "type": "library",
129 | "extra": {
130 | "branch-alias": {
131 | "dev-main": "2.5-dev"
132 | },
133 | "thanks": {
134 | "name": "symfony/contracts",
135 | "url": "https://github.com/symfony/contracts"
136 | }
137 | },
138 | "autoload": {
139 | "files": [
140 | "function.php"
141 | ]
142 | },
143 | "notification-url": "https://packagist.org/downloads/",
144 | "license": [
145 | "MIT"
146 | ],
147 | "authors": [
148 | {
149 | "name": "Nicolas Grekas",
150 | "email": "p@tchwork.com"
151 | },
152 | {
153 | "name": "Symfony Community",
154 | "homepage": "https://symfony.com/contributors"
155 | }
156 | ],
157 | "description": "A generic function and convention to trigger deprecation notices",
158 | "homepage": "https://symfony.com",
159 | "support": {
160 | "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
161 | },
162 | "funding": [
163 | {
164 | "url": "https://symfony.com/sponsor",
165 | "type": "custom"
166 | },
167 | {
168 | "url": "https://github.com/fabpot",
169 | "type": "github"
170 | },
171 | {
172 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
173 | "type": "tidelift"
174 | }
175 | ],
176 | "time": "2022-01-02T09:53:40+00:00"
177 | },
178 | {
179 | "name": "symfony/polyfill-mbstring",
180 | "version": "v1.27.0",
181 | "source": {
182 | "type": "git",
183 | "url": "https://github.com/symfony/polyfill-mbstring.git",
184 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
185 | },
186 | "dist": {
187 | "type": "zip",
188 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
189 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
190 | "shasum": ""
191 | },
192 | "require": {
193 | "php": ">=7.1"
194 | },
195 | "provide": {
196 | "ext-mbstring": "*"
197 | },
198 | "suggest": {
199 | "ext-mbstring": "For best performance"
200 | },
201 | "type": "library",
202 | "extra": {
203 | "branch-alias": {
204 | "dev-main": "1.27-dev"
205 | },
206 | "thanks": {
207 | "name": "symfony/polyfill",
208 | "url": "https://github.com/symfony/polyfill"
209 | }
210 | },
211 | "autoload": {
212 | "files": [
213 | "bootstrap.php"
214 | ],
215 | "psr-4": {
216 | "Symfony\\Polyfill\\Mbstring\\": ""
217 | }
218 | },
219 | "notification-url": "https://packagist.org/downloads/",
220 | "license": [
221 | "MIT"
222 | ],
223 | "authors": [
224 | {
225 | "name": "Nicolas Grekas",
226 | "email": "p@tchwork.com"
227 | },
228 | {
229 | "name": "Symfony Community",
230 | "homepage": "https://symfony.com/contributors"
231 | }
232 | ],
233 | "description": "Symfony polyfill for the Mbstring extension",
234 | "homepage": "https://symfony.com",
235 | "keywords": [
236 | "compatibility",
237 | "mbstring",
238 | "polyfill",
239 | "portable",
240 | "shim"
241 | ],
242 | "support": {
243 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
244 | },
245 | "funding": [
246 | {
247 | "url": "https://symfony.com/sponsor",
248 | "type": "custom"
249 | },
250 | {
251 | "url": "https://github.com/fabpot",
252 | "type": "github"
253 | },
254 | {
255 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
256 | "type": "tidelift"
257 | }
258 | ],
259 | "time": "2022-11-03T14:55:06+00:00"
260 | },
261 | {
262 | "name": "symfony/polyfill-php80",
263 | "version": "v1.27.0",
264 | "source": {
265 | "type": "git",
266 | "url": "https://github.com/symfony/polyfill-php80.git",
267 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
268 | },
269 | "dist": {
270 | "type": "zip",
271 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
272 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
273 | "shasum": ""
274 | },
275 | "require": {
276 | "php": ">=7.1"
277 | },
278 | "type": "library",
279 | "extra": {
280 | "branch-alias": {
281 | "dev-main": "1.27-dev"
282 | },
283 | "thanks": {
284 | "name": "symfony/polyfill",
285 | "url": "https://github.com/symfony/polyfill"
286 | }
287 | },
288 | "autoload": {
289 | "files": [
290 | "bootstrap.php"
291 | ],
292 | "psr-4": {
293 | "Symfony\\Polyfill\\Php80\\": ""
294 | },
295 | "classmap": [
296 | "Resources/stubs"
297 | ]
298 | },
299 | "notification-url": "https://packagist.org/downloads/",
300 | "license": [
301 | "MIT"
302 | ],
303 | "authors": [
304 | {
305 | "name": "Ion Bazan",
306 | "email": "ion.bazan@gmail.com"
307 | },
308 | {
309 | "name": "Nicolas Grekas",
310 | "email": "p@tchwork.com"
311 | },
312 | {
313 | "name": "Symfony Community",
314 | "homepage": "https://symfony.com/contributors"
315 | }
316 | ],
317 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
318 | "homepage": "https://symfony.com",
319 | "keywords": [
320 | "compatibility",
321 | "polyfill",
322 | "portable",
323 | "shim"
324 | ],
325 | "support": {
326 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
327 | },
328 | "funding": [
329 | {
330 | "url": "https://symfony.com/sponsor",
331 | "type": "custom"
332 | },
333 | {
334 | "url": "https://github.com/fabpot",
335 | "type": "github"
336 | },
337 | {
338 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
339 | "type": "tidelift"
340 | }
341 | ],
342 | "time": "2022-11-03T14:55:06+00:00"
343 | },
344 | {
345 | "name": "symfony/translation",
346 | "version": "v5.4.14",
347 | "source": {
348 | "type": "git",
349 | "url": "https://github.com/symfony/translation.git",
350 | "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab"
351 | },
352 | "dist": {
353 | "type": "zip",
354 | "url": "https://api.github.com/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab",
355 | "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab",
356 | "shasum": ""
357 | },
358 | "require": {
359 | "php": ">=7.2.5",
360 | "symfony/deprecation-contracts": "^2.1|^3",
361 | "symfony/polyfill-mbstring": "~1.0",
362 | "symfony/polyfill-php80": "^1.16",
363 | "symfony/translation-contracts": "^2.3"
364 | },
365 | "conflict": {
366 | "symfony/config": "<4.4",
367 | "symfony/console": "<5.3",
368 | "symfony/dependency-injection": "<5.0",
369 | "symfony/http-kernel": "<5.0",
370 | "symfony/twig-bundle": "<5.0",
371 | "symfony/yaml": "<4.4"
372 | },
373 | "provide": {
374 | "symfony/translation-implementation": "2.3"
375 | },
376 | "require-dev": {
377 | "psr/log": "^1|^2|^3",
378 | "symfony/config": "^4.4|^5.0|^6.0",
379 | "symfony/console": "^5.4|^6.0",
380 | "symfony/dependency-injection": "^5.0|^6.0",
381 | "symfony/finder": "^4.4|^5.0|^6.0",
382 | "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
383 | "symfony/http-kernel": "^5.0|^6.0",
384 | "symfony/intl": "^4.4|^5.0|^6.0",
385 | "symfony/polyfill-intl-icu": "^1.21",
386 | "symfony/service-contracts": "^1.1.2|^2|^3",
387 | "symfony/yaml": "^4.4|^5.0|^6.0"
388 | },
389 | "suggest": {
390 | "psr/log-implementation": "To use logging capability in translator",
391 | "symfony/config": "",
392 | "symfony/yaml": ""
393 | },
394 | "type": "library",
395 | "autoload": {
396 | "files": [
397 | "Resources/functions.php"
398 | ],
399 | "psr-4": {
400 | "Symfony\\Component\\Translation\\": ""
401 | },
402 | "exclude-from-classmap": [
403 | "/Tests/"
404 | ]
405 | },
406 | "notification-url": "https://packagist.org/downloads/",
407 | "license": [
408 | "MIT"
409 | ],
410 | "authors": [
411 | {
412 | "name": "Fabien Potencier",
413 | "email": "fabien@symfony.com"
414 | },
415 | {
416 | "name": "Symfony Community",
417 | "homepage": "https://symfony.com/contributors"
418 | }
419 | ],
420 | "description": "Provides tools to internationalize your application",
421 | "homepage": "https://symfony.com",
422 | "support": {
423 | "source": "https://github.com/symfony/translation/tree/v5.4.14"
424 | },
425 | "funding": [
426 | {
427 | "url": "https://symfony.com/sponsor",
428 | "type": "custom"
429 | },
430 | {
431 | "url": "https://github.com/fabpot",
432 | "type": "github"
433 | },
434 | {
435 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
436 | "type": "tidelift"
437 | }
438 | ],
439 | "time": "2022-10-07T08:01:20+00:00"
440 | },
441 | {
442 | "name": "symfony/translation-contracts",
443 | "version": "v2.5.2",
444 | "source": {
445 | "type": "git",
446 | "url": "https://github.com/symfony/translation-contracts.git",
447 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe"
448 | },
449 | "dist": {
450 | "type": "zip",
451 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe",
452 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe",
453 | "shasum": ""
454 | },
455 | "require": {
456 | "php": ">=7.2.5"
457 | },
458 | "suggest": {
459 | "symfony/translation-implementation": ""
460 | },
461 | "type": "library",
462 | "extra": {
463 | "branch-alias": {
464 | "dev-main": "2.5-dev"
465 | },
466 | "thanks": {
467 | "name": "symfony/contracts",
468 | "url": "https://github.com/symfony/contracts"
469 | }
470 | },
471 | "autoload": {
472 | "psr-4": {
473 | "Symfony\\Contracts\\Translation\\": ""
474 | }
475 | },
476 | "notification-url": "https://packagist.org/downloads/",
477 | "license": [
478 | "MIT"
479 | ],
480 | "authors": [
481 | {
482 | "name": "Nicolas Grekas",
483 | "email": "p@tchwork.com"
484 | },
485 | {
486 | "name": "Symfony Community",
487 | "homepage": "https://symfony.com/contributors"
488 | }
489 | ],
490 | "description": "Generic abstractions related to translation",
491 | "homepage": "https://symfony.com",
492 | "keywords": [
493 | "abstractions",
494 | "contracts",
495 | "decoupling",
496 | "interfaces",
497 | "interoperability",
498 | "standards"
499 | ],
500 | "support": {
501 | "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2"
502 | },
503 | "funding": [
504 | {
505 | "url": "https://symfony.com/sponsor",
506 | "type": "custom"
507 | },
508 | {
509 | "url": "https://github.com/fabpot",
510 | "type": "github"
511 | },
512 | {
513 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
514 | "type": "tidelift"
515 | }
516 | ],
517 | "time": "2022-06-27T16:58:25+00:00"
518 | }
519 | ],
520 | "packages-dev": [
521 | {
522 | "name": "doctrine/instantiator",
523 | "version": "1.5.0",
524 | "source": {
525 | "type": "git",
526 | "url": "https://github.com/doctrine/instantiator.git",
527 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
528 | },
529 | "dist": {
530 | "type": "zip",
531 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
532 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
533 | "shasum": ""
534 | },
535 | "require": {
536 | "php": "^7.1 || ^8.0"
537 | },
538 | "require-dev": {
539 | "doctrine/coding-standard": "^9 || ^11",
540 | "ext-pdo": "*",
541 | "ext-phar": "*",
542 | "phpbench/phpbench": "^0.16 || ^1",
543 | "phpstan/phpstan": "^1.4",
544 | "phpstan/phpstan-phpunit": "^1",
545 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
546 | "vimeo/psalm": "^4.30 || ^5.4"
547 | },
548 | "type": "library",
549 | "autoload": {
550 | "psr-4": {
551 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
552 | }
553 | },
554 | "notification-url": "https://packagist.org/downloads/",
555 | "license": [
556 | "MIT"
557 | ],
558 | "authors": [
559 | {
560 | "name": "Marco Pivetta",
561 | "email": "ocramius@gmail.com",
562 | "homepage": "https://ocramius.github.io/"
563 | }
564 | ],
565 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
566 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
567 | "keywords": [
568 | "constructor",
569 | "instantiate"
570 | ],
571 | "support": {
572 | "issues": "https://github.com/doctrine/instantiator/issues",
573 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
574 | },
575 | "funding": [
576 | {
577 | "url": "https://www.doctrine-project.org/sponsorship.html",
578 | "type": "custom"
579 | },
580 | {
581 | "url": "https://www.patreon.com/phpdoctrine",
582 | "type": "patreon"
583 | },
584 | {
585 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
586 | "type": "tidelift"
587 | }
588 | ],
589 | "time": "2022-12-30T00:15:36+00:00"
590 | },
591 | {
592 | "name": "myclabs/deep-copy",
593 | "version": "1.11.0",
594 | "source": {
595 | "type": "git",
596 | "url": "https://github.com/myclabs/DeepCopy.git",
597 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
598 | },
599 | "dist": {
600 | "type": "zip",
601 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
602 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
603 | "shasum": ""
604 | },
605 | "require": {
606 | "php": "^7.1 || ^8.0"
607 | },
608 | "conflict": {
609 | "doctrine/collections": "<1.6.8",
610 | "doctrine/common": "<2.13.3 || >=3,<3.2.2"
611 | },
612 | "require-dev": {
613 | "doctrine/collections": "^1.6.8",
614 | "doctrine/common": "^2.13.3 || ^3.2.2",
615 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
616 | },
617 | "type": "library",
618 | "autoload": {
619 | "files": [
620 | "src/DeepCopy/deep_copy.php"
621 | ],
622 | "psr-4": {
623 | "DeepCopy\\": "src/DeepCopy/"
624 | }
625 | },
626 | "notification-url": "https://packagist.org/downloads/",
627 | "license": [
628 | "MIT"
629 | ],
630 | "description": "Create deep copies (clones) of your objects",
631 | "keywords": [
632 | "clone",
633 | "copy",
634 | "duplicate",
635 | "object",
636 | "object graph"
637 | ],
638 | "support": {
639 | "issues": "https://github.com/myclabs/DeepCopy/issues",
640 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
641 | },
642 | "funding": [
643 | {
644 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
645 | "type": "tidelift"
646 | }
647 | ],
648 | "time": "2022-03-03T13:19:32+00:00"
649 | },
650 | {
651 | "name": "nikic/php-parser",
652 | "version": "v4.15.2",
653 | "source": {
654 | "type": "git",
655 | "url": "https://github.com/nikic/PHP-Parser.git",
656 | "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc"
657 | },
658 | "dist": {
659 | "type": "zip",
660 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
661 | "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc",
662 | "shasum": ""
663 | },
664 | "require": {
665 | "ext-tokenizer": "*",
666 | "php": ">=7.0"
667 | },
668 | "require-dev": {
669 | "ircmaxell/php-yacc": "^0.0.7",
670 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
671 | },
672 | "bin": [
673 | "bin/php-parse"
674 | ],
675 | "type": "library",
676 | "extra": {
677 | "branch-alias": {
678 | "dev-master": "4.9-dev"
679 | }
680 | },
681 | "autoload": {
682 | "psr-4": {
683 | "PhpParser\\": "lib/PhpParser"
684 | }
685 | },
686 | "notification-url": "https://packagist.org/downloads/",
687 | "license": [
688 | "BSD-3-Clause"
689 | ],
690 | "authors": [
691 | {
692 | "name": "Nikita Popov"
693 | }
694 | ],
695 | "description": "A PHP parser written in PHP",
696 | "keywords": [
697 | "parser",
698 | "php"
699 | ],
700 | "support": {
701 | "issues": "https://github.com/nikic/PHP-Parser/issues",
702 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2"
703 | },
704 | "time": "2022-11-12T15:38:23+00:00"
705 | },
706 | {
707 | "name": "phar-io/manifest",
708 | "version": "2.0.3",
709 | "source": {
710 | "type": "git",
711 | "url": "https://github.com/phar-io/manifest.git",
712 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
713 | },
714 | "dist": {
715 | "type": "zip",
716 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
717 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
718 | "shasum": ""
719 | },
720 | "require": {
721 | "ext-dom": "*",
722 | "ext-phar": "*",
723 | "ext-xmlwriter": "*",
724 | "phar-io/version": "^3.0.1",
725 | "php": "^7.2 || ^8.0"
726 | },
727 | "type": "library",
728 | "extra": {
729 | "branch-alias": {
730 | "dev-master": "2.0.x-dev"
731 | }
732 | },
733 | "autoload": {
734 | "classmap": [
735 | "src/"
736 | ]
737 | },
738 | "notification-url": "https://packagist.org/downloads/",
739 | "license": [
740 | "BSD-3-Clause"
741 | ],
742 | "authors": [
743 | {
744 | "name": "Arne Blankerts",
745 | "email": "arne@blankerts.de",
746 | "role": "Developer"
747 | },
748 | {
749 | "name": "Sebastian Heuer",
750 | "email": "sebastian@phpeople.de",
751 | "role": "Developer"
752 | },
753 | {
754 | "name": "Sebastian Bergmann",
755 | "email": "sebastian@phpunit.de",
756 | "role": "Developer"
757 | }
758 | ],
759 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
760 | "support": {
761 | "issues": "https://github.com/phar-io/manifest/issues",
762 | "source": "https://github.com/phar-io/manifest/tree/2.0.3"
763 | },
764 | "time": "2021-07-20T11:28:43+00:00"
765 | },
766 | {
767 | "name": "phar-io/version",
768 | "version": "3.2.1",
769 | "source": {
770 | "type": "git",
771 | "url": "https://github.com/phar-io/version.git",
772 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
773 | },
774 | "dist": {
775 | "type": "zip",
776 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
777 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
778 | "shasum": ""
779 | },
780 | "require": {
781 | "php": "^7.2 || ^8.0"
782 | },
783 | "type": "library",
784 | "autoload": {
785 | "classmap": [
786 | "src/"
787 | ]
788 | },
789 | "notification-url": "https://packagist.org/downloads/",
790 | "license": [
791 | "BSD-3-Clause"
792 | ],
793 | "authors": [
794 | {
795 | "name": "Arne Blankerts",
796 | "email": "arne@blankerts.de",
797 | "role": "Developer"
798 | },
799 | {
800 | "name": "Sebastian Heuer",
801 | "email": "sebastian@phpeople.de",
802 | "role": "Developer"
803 | },
804 | {
805 | "name": "Sebastian Bergmann",
806 | "email": "sebastian@phpunit.de",
807 | "role": "Developer"
808 | }
809 | ],
810 | "description": "Library for handling version information and constraints",
811 | "support": {
812 | "issues": "https://github.com/phar-io/version/issues",
813 | "source": "https://github.com/phar-io/version/tree/3.2.1"
814 | },
815 | "time": "2022-02-21T01:04:05+00:00"
816 | },
817 | {
818 | "name": "phpunit/php-code-coverage",
819 | "version": "9.2.23",
820 | "source": {
821 | "type": "git",
822 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
823 | "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c"
824 | },
825 | "dist": {
826 | "type": "zip",
827 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
828 | "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
829 | "shasum": ""
830 | },
831 | "require": {
832 | "ext-dom": "*",
833 | "ext-libxml": "*",
834 | "ext-xmlwriter": "*",
835 | "nikic/php-parser": "^4.14",
836 | "php": ">=7.3",
837 | "phpunit/php-file-iterator": "^3.0.3",
838 | "phpunit/php-text-template": "^2.0.2",
839 | "sebastian/code-unit-reverse-lookup": "^2.0.2",
840 | "sebastian/complexity": "^2.0",
841 | "sebastian/environment": "^5.1.2",
842 | "sebastian/lines-of-code": "^1.0.3",
843 | "sebastian/version": "^3.0.1",
844 | "theseer/tokenizer": "^1.2.0"
845 | },
846 | "require-dev": {
847 | "phpunit/phpunit": "^9.3"
848 | },
849 | "suggest": {
850 | "ext-pcov": "*",
851 | "ext-xdebug": "*"
852 | },
853 | "type": "library",
854 | "extra": {
855 | "branch-alias": {
856 | "dev-master": "9.2-dev"
857 | }
858 | },
859 | "autoload": {
860 | "classmap": [
861 | "src/"
862 | ]
863 | },
864 | "notification-url": "https://packagist.org/downloads/",
865 | "license": [
866 | "BSD-3-Clause"
867 | ],
868 | "authors": [
869 | {
870 | "name": "Sebastian Bergmann",
871 | "email": "sebastian@phpunit.de",
872 | "role": "lead"
873 | }
874 | ],
875 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
876 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
877 | "keywords": [
878 | "coverage",
879 | "testing",
880 | "xunit"
881 | ],
882 | "support": {
883 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
884 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23"
885 | },
886 | "funding": [
887 | {
888 | "url": "https://github.com/sebastianbergmann",
889 | "type": "github"
890 | }
891 | ],
892 | "time": "2022-12-28T12:41:10+00:00"
893 | },
894 | {
895 | "name": "phpunit/php-file-iterator",
896 | "version": "3.0.6",
897 | "source": {
898 | "type": "git",
899 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
900 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
901 | },
902 | "dist": {
903 | "type": "zip",
904 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
905 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
906 | "shasum": ""
907 | },
908 | "require": {
909 | "php": ">=7.3"
910 | },
911 | "require-dev": {
912 | "phpunit/phpunit": "^9.3"
913 | },
914 | "type": "library",
915 | "extra": {
916 | "branch-alias": {
917 | "dev-master": "3.0-dev"
918 | }
919 | },
920 | "autoload": {
921 | "classmap": [
922 | "src/"
923 | ]
924 | },
925 | "notification-url": "https://packagist.org/downloads/",
926 | "license": [
927 | "BSD-3-Clause"
928 | ],
929 | "authors": [
930 | {
931 | "name": "Sebastian Bergmann",
932 | "email": "sebastian@phpunit.de",
933 | "role": "lead"
934 | }
935 | ],
936 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
937 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
938 | "keywords": [
939 | "filesystem",
940 | "iterator"
941 | ],
942 | "support": {
943 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
944 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
945 | },
946 | "funding": [
947 | {
948 | "url": "https://github.com/sebastianbergmann",
949 | "type": "github"
950 | }
951 | ],
952 | "time": "2021-12-02T12:48:52+00:00"
953 | },
954 | {
955 | "name": "phpunit/php-invoker",
956 | "version": "3.1.1",
957 | "source": {
958 | "type": "git",
959 | "url": "https://github.com/sebastianbergmann/php-invoker.git",
960 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
961 | },
962 | "dist": {
963 | "type": "zip",
964 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
965 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
966 | "shasum": ""
967 | },
968 | "require": {
969 | "php": ">=7.3"
970 | },
971 | "require-dev": {
972 | "ext-pcntl": "*",
973 | "phpunit/phpunit": "^9.3"
974 | },
975 | "suggest": {
976 | "ext-pcntl": "*"
977 | },
978 | "type": "library",
979 | "extra": {
980 | "branch-alias": {
981 | "dev-master": "3.1-dev"
982 | }
983 | },
984 | "autoload": {
985 | "classmap": [
986 | "src/"
987 | ]
988 | },
989 | "notification-url": "https://packagist.org/downloads/",
990 | "license": [
991 | "BSD-3-Clause"
992 | ],
993 | "authors": [
994 | {
995 | "name": "Sebastian Bergmann",
996 | "email": "sebastian@phpunit.de",
997 | "role": "lead"
998 | }
999 | ],
1000 | "description": "Invoke callables with a timeout",
1001 | "homepage": "https://github.com/sebastianbergmann/php-invoker/",
1002 | "keywords": [
1003 | "process"
1004 | ],
1005 | "support": {
1006 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
1007 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
1008 | },
1009 | "funding": [
1010 | {
1011 | "url": "https://github.com/sebastianbergmann",
1012 | "type": "github"
1013 | }
1014 | ],
1015 | "time": "2020-09-28T05:58:55+00:00"
1016 | },
1017 | {
1018 | "name": "phpunit/php-text-template",
1019 | "version": "2.0.4",
1020 | "source": {
1021 | "type": "git",
1022 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
1023 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
1024 | },
1025 | "dist": {
1026 | "type": "zip",
1027 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1028 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1029 | "shasum": ""
1030 | },
1031 | "require": {
1032 | "php": ">=7.3"
1033 | },
1034 | "require-dev": {
1035 | "phpunit/phpunit": "^9.3"
1036 | },
1037 | "type": "library",
1038 | "extra": {
1039 | "branch-alias": {
1040 | "dev-master": "2.0-dev"
1041 | }
1042 | },
1043 | "autoload": {
1044 | "classmap": [
1045 | "src/"
1046 | ]
1047 | },
1048 | "notification-url": "https://packagist.org/downloads/",
1049 | "license": [
1050 | "BSD-3-Clause"
1051 | ],
1052 | "authors": [
1053 | {
1054 | "name": "Sebastian Bergmann",
1055 | "email": "sebastian@phpunit.de",
1056 | "role": "lead"
1057 | }
1058 | ],
1059 | "description": "Simple template engine.",
1060 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1061 | "keywords": [
1062 | "template"
1063 | ],
1064 | "support": {
1065 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
1066 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
1067 | },
1068 | "funding": [
1069 | {
1070 | "url": "https://github.com/sebastianbergmann",
1071 | "type": "github"
1072 | }
1073 | ],
1074 | "time": "2020-10-26T05:33:50+00:00"
1075 | },
1076 | {
1077 | "name": "phpunit/php-timer",
1078 | "version": "5.0.3",
1079 | "source": {
1080 | "type": "git",
1081 | "url": "https://github.com/sebastianbergmann/php-timer.git",
1082 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
1083 | },
1084 | "dist": {
1085 | "type": "zip",
1086 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1087 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1088 | "shasum": ""
1089 | },
1090 | "require": {
1091 | "php": ">=7.3"
1092 | },
1093 | "require-dev": {
1094 | "phpunit/phpunit": "^9.3"
1095 | },
1096 | "type": "library",
1097 | "extra": {
1098 | "branch-alias": {
1099 | "dev-master": "5.0-dev"
1100 | }
1101 | },
1102 | "autoload": {
1103 | "classmap": [
1104 | "src/"
1105 | ]
1106 | },
1107 | "notification-url": "https://packagist.org/downloads/",
1108 | "license": [
1109 | "BSD-3-Clause"
1110 | ],
1111 | "authors": [
1112 | {
1113 | "name": "Sebastian Bergmann",
1114 | "email": "sebastian@phpunit.de",
1115 | "role": "lead"
1116 | }
1117 | ],
1118 | "description": "Utility class for timing",
1119 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
1120 | "keywords": [
1121 | "timer"
1122 | ],
1123 | "support": {
1124 | "issues": "https://github.com/sebastianbergmann/php-timer/issues",
1125 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
1126 | },
1127 | "funding": [
1128 | {
1129 | "url": "https://github.com/sebastianbergmann",
1130 | "type": "github"
1131 | }
1132 | ],
1133 | "time": "2020-10-26T13:16:10+00:00"
1134 | },
1135 | {
1136 | "name": "phpunit/phpunit",
1137 | "version": "9.5.27",
1138 | "source": {
1139 | "type": "git",
1140 | "url": "https://github.com/sebastianbergmann/phpunit.git",
1141 | "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38"
1142 | },
1143 | "dist": {
1144 | "type": "zip",
1145 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38",
1146 | "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38",
1147 | "shasum": ""
1148 | },
1149 | "require": {
1150 | "doctrine/instantiator": "^1.3.1",
1151 | "ext-dom": "*",
1152 | "ext-json": "*",
1153 | "ext-libxml": "*",
1154 | "ext-mbstring": "*",
1155 | "ext-xml": "*",
1156 | "ext-xmlwriter": "*",
1157 | "myclabs/deep-copy": "^1.10.1",
1158 | "phar-io/manifest": "^2.0.3",
1159 | "phar-io/version": "^3.0.2",
1160 | "php": ">=7.3",
1161 | "phpunit/php-code-coverage": "^9.2.13",
1162 | "phpunit/php-file-iterator": "^3.0.5",
1163 | "phpunit/php-invoker": "^3.1.1",
1164 | "phpunit/php-text-template": "^2.0.3",
1165 | "phpunit/php-timer": "^5.0.2",
1166 | "sebastian/cli-parser": "^1.0.1",
1167 | "sebastian/code-unit": "^1.0.6",
1168 | "sebastian/comparator": "^4.0.8",
1169 | "sebastian/diff": "^4.0.3",
1170 | "sebastian/environment": "^5.1.3",
1171 | "sebastian/exporter": "^4.0.5",
1172 | "sebastian/global-state": "^5.0.1",
1173 | "sebastian/object-enumerator": "^4.0.3",
1174 | "sebastian/resource-operations": "^3.0.3",
1175 | "sebastian/type": "^3.2",
1176 | "sebastian/version": "^3.0.2"
1177 | },
1178 | "suggest": {
1179 | "ext-soap": "*",
1180 | "ext-xdebug": "*"
1181 | },
1182 | "bin": [
1183 | "phpunit"
1184 | ],
1185 | "type": "library",
1186 | "extra": {
1187 | "branch-alias": {
1188 | "dev-master": "9.5-dev"
1189 | }
1190 | },
1191 | "autoload": {
1192 | "files": [
1193 | "src/Framework/Assert/Functions.php"
1194 | ],
1195 | "classmap": [
1196 | "src/"
1197 | ]
1198 | },
1199 | "notification-url": "https://packagist.org/downloads/",
1200 | "license": [
1201 | "BSD-3-Clause"
1202 | ],
1203 | "authors": [
1204 | {
1205 | "name": "Sebastian Bergmann",
1206 | "email": "sebastian@phpunit.de",
1207 | "role": "lead"
1208 | }
1209 | ],
1210 | "description": "The PHP Unit Testing framework.",
1211 | "homepage": "https://phpunit.de/",
1212 | "keywords": [
1213 | "phpunit",
1214 | "testing",
1215 | "xunit"
1216 | ],
1217 | "support": {
1218 | "issues": "https://github.com/sebastianbergmann/phpunit/issues",
1219 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27"
1220 | },
1221 | "funding": [
1222 | {
1223 | "url": "https://phpunit.de/sponsors.html",
1224 | "type": "custom"
1225 | },
1226 | {
1227 | "url": "https://github.com/sebastianbergmann",
1228 | "type": "github"
1229 | },
1230 | {
1231 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
1232 | "type": "tidelift"
1233 | }
1234 | ],
1235 | "time": "2022-12-09T07:31:23+00:00"
1236 | },
1237 | {
1238 | "name": "sebastian/cli-parser",
1239 | "version": "1.0.1",
1240 | "source": {
1241 | "type": "git",
1242 | "url": "https://github.com/sebastianbergmann/cli-parser.git",
1243 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
1244 | },
1245 | "dist": {
1246 | "type": "zip",
1247 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1248 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1249 | "shasum": ""
1250 | },
1251 | "require": {
1252 | "php": ">=7.3"
1253 | },
1254 | "require-dev": {
1255 | "phpunit/phpunit": "^9.3"
1256 | },
1257 | "type": "library",
1258 | "extra": {
1259 | "branch-alias": {
1260 | "dev-master": "1.0-dev"
1261 | }
1262 | },
1263 | "autoload": {
1264 | "classmap": [
1265 | "src/"
1266 | ]
1267 | },
1268 | "notification-url": "https://packagist.org/downloads/",
1269 | "license": [
1270 | "BSD-3-Clause"
1271 | ],
1272 | "authors": [
1273 | {
1274 | "name": "Sebastian Bergmann",
1275 | "email": "sebastian@phpunit.de",
1276 | "role": "lead"
1277 | }
1278 | ],
1279 | "description": "Library for parsing CLI options",
1280 | "homepage": "https://github.com/sebastianbergmann/cli-parser",
1281 | "support": {
1282 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
1283 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
1284 | },
1285 | "funding": [
1286 | {
1287 | "url": "https://github.com/sebastianbergmann",
1288 | "type": "github"
1289 | }
1290 | ],
1291 | "time": "2020-09-28T06:08:49+00:00"
1292 | },
1293 | {
1294 | "name": "sebastian/code-unit",
1295 | "version": "1.0.8",
1296 | "source": {
1297 | "type": "git",
1298 | "url": "https://github.com/sebastianbergmann/code-unit.git",
1299 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
1300 | },
1301 | "dist": {
1302 | "type": "zip",
1303 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
1304 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
1305 | "shasum": ""
1306 | },
1307 | "require": {
1308 | "php": ">=7.3"
1309 | },
1310 | "require-dev": {
1311 | "phpunit/phpunit": "^9.3"
1312 | },
1313 | "type": "library",
1314 | "extra": {
1315 | "branch-alias": {
1316 | "dev-master": "1.0-dev"
1317 | }
1318 | },
1319 | "autoload": {
1320 | "classmap": [
1321 | "src/"
1322 | ]
1323 | },
1324 | "notification-url": "https://packagist.org/downloads/",
1325 | "license": [
1326 | "BSD-3-Clause"
1327 | ],
1328 | "authors": [
1329 | {
1330 | "name": "Sebastian Bergmann",
1331 | "email": "sebastian@phpunit.de",
1332 | "role": "lead"
1333 | }
1334 | ],
1335 | "description": "Collection of value objects that represent the PHP code units",
1336 | "homepage": "https://github.com/sebastianbergmann/code-unit",
1337 | "support": {
1338 | "issues": "https://github.com/sebastianbergmann/code-unit/issues",
1339 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
1340 | },
1341 | "funding": [
1342 | {
1343 | "url": "https://github.com/sebastianbergmann",
1344 | "type": "github"
1345 | }
1346 | ],
1347 | "time": "2020-10-26T13:08:54+00:00"
1348 | },
1349 | {
1350 | "name": "sebastian/code-unit-reverse-lookup",
1351 | "version": "2.0.3",
1352 | "source": {
1353 | "type": "git",
1354 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1355 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
1356 | },
1357 | "dist": {
1358 | "type": "zip",
1359 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1360 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1361 | "shasum": ""
1362 | },
1363 | "require": {
1364 | "php": ">=7.3"
1365 | },
1366 | "require-dev": {
1367 | "phpunit/phpunit": "^9.3"
1368 | },
1369 | "type": "library",
1370 | "extra": {
1371 | "branch-alias": {
1372 | "dev-master": "2.0-dev"
1373 | }
1374 | },
1375 | "autoload": {
1376 | "classmap": [
1377 | "src/"
1378 | ]
1379 | },
1380 | "notification-url": "https://packagist.org/downloads/",
1381 | "license": [
1382 | "BSD-3-Clause"
1383 | ],
1384 | "authors": [
1385 | {
1386 | "name": "Sebastian Bergmann",
1387 | "email": "sebastian@phpunit.de"
1388 | }
1389 | ],
1390 | "description": "Looks up which function or method a line of code belongs to",
1391 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1392 | "support": {
1393 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
1394 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
1395 | },
1396 | "funding": [
1397 | {
1398 | "url": "https://github.com/sebastianbergmann",
1399 | "type": "github"
1400 | }
1401 | ],
1402 | "time": "2020-09-28T05:30:19+00:00"
1403 | },
1404 | {
1405 | "name": "sebastian/comparator",
1406 | "version": "4.0.8",
1407 | "source": {
1408 | "type": "git",
1409 | "url": "https://github.com/sebastianbergmann/comparator.git",
1410 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
1411 | },
1412 | "dist": {
1413 | "type": "zip",
1414 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
1415 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
1416 | "shasum": ""
1417 | },
1418 | "require": {
1419 | "php": ">=7.3",
1420 | "sebastian/diff": "^4.0",
1421 | "sebastian/exporter": "^4.0"
1422 | },
1423 | "require-dev": {
1424 | "phpunit/phpunit": "^9.3"
1425 | },
1426 | "type": "library",
1427 | "extra": {
1428 | "branch-alias": {
1429 | "dev-master": "4.0-dev"
1430 | }
1431 | },
1432 | "autoload": {
1433 | "classmap": [
1434 | "src/"
1435 | ]
1436 | },
1437 | "notification-url": "https://packagist.org/downloads/",
1438 | "license": [
1439 | "BSD-3-Clause"
1440 | ],
1441 | "authors": [
1442 | {
1443 | "name": "Sebastian Bergmann",
1444 | "email": "sebastian@phpunit.de"
1445 | },
1446 | {
1447 | "name": "Jeff Welch",
1448 | "email": "whatthejeff@gmail.com"
1449 | },
1450 | {
1451 | "name": "Volker Dusch",
1452 | "email": "github@wallbash.com"
1453 | },
1454 | {
1455 | "name": "Bernhard Schussek",
1456 | "email": "bschussek@2bepublished.at"
1457 | }
1458 | ],
1459 | "description": "Provides the functionality to compare PHP values for equality",
1460 | "homepage": "https://github.com/sebastianbergmann/comparator",
1461 | "keywords": [
1462 | "comparator",
1463 | "compare",
1464 | "equality"
1465 | ],
1466 | "support": {
1467 | "issues": "https://github.com/sebastianbergmann/comparator/issues",
1468 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
1469 | },
1470 | "funding": [
1471 | {
1472 | "url": "https://github.com/sebastianbergmann",
1473 | "type": "github"
1474 | }
1475 | ],
1476 | "time": "2022-09-14T12:41:17+00:00"
1477 | },
1478 | {
1479 | "name": "sebastian/complexity",
1480 | "version": "2.0.2",
1481 | "source": {
1482 | "type": "git",
1483 | "url": "https://github.com/sebastianbergmann/complexity.git",
1484 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
1485 | },
1486 | "dist": {
1487 | "type": "zip",
1488 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
1489 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
1490 | "shasum": ""
1491 | },
1492 | "require": {
1493 | "nikic/php-parser": "^4.7",
1494 | "php": ">=7.3"
1495 | },
1496 | "require-dev": {
1497 | "phpunit/phpunit": "^9.3"
1498 | },
1499 | "type": "library",
1500 | "extra": {
1501 | "branch-alias": {
1502 | "dev-master": "2.0-dev"
1503 | }
1504 | },
1505 | "autoload": {
1506 | "classmap": [
1507 | "src/"
1508 | ]
1509 | },
1510 | "notification-url": "https://packagist.org/downloads/",
1511 | "license": [
1512 | "BSD-3-Clause"
1513 | ],
1514 | "authors": [
1515 | {
1516 | "name": "Sebastian Bergmann",
1517 | "email": "sebastian@phpunit.de",
1518 | "role": "lead"
1519 | }
1520 | ],
1521 | "description": "Library for calculating the complexity of PHP code units",
1522 | "homepage": "https://github.com/sebastianbergmann/complexity",
1523 | "support": {
1524 | "issues": "https://github.com/sebastianbergmann/complexity/issues",
1525 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
1526 | },
1527 | "funding": [
1528 | {
1529 | "url": "https://github.com/sebastianbergmann",
1530 | "type": "github"
1531 | }
1532 | ],
1533 | "time": "2020-10-26T15:52:27+00:00"
1534 | },
1535 | {
1536 | "name": "sebastian/diff",
1537 | "version": "4.0.4",
1538 | "source": {
1539 | "type": "git",
1540 | "url": "https://github.com/sebastianbergmann/diff.git",
1541 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
1542 | },
1543 | "dist": {
1544 | "type": "zip",
1545 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1546 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1547 | "shasum": ""
1548 | },
1549 | "require": {
1550 | "php": ">=7.3"
1551 | },
1552 | "require-dev": {
1553 | "phpunit/phpunit": "^9.3",
1554 | "symfony/process": "^4.2 || ^5"
1555 | },
1556 | "type": "library",
1557 | "extra": {
1558 | "branch-alias": {
1559 | "dev-master": "4.0-dev"
1560 | }
1561 | },
1562 | "autoload": {
1563 | "classmap": [
1564 | "src/"
1565 | ]
1566 | },
1567 | "notification-url": "https://packagist.org/downloads/",
1568 | "license": [
1569 | "BSD-3-Clause"
1570 | ],
1571 | "authors": [
1572 | {
1573 | "name": "Sebastian Bergmann",
1574 | "email": "sebastian@phpunit.de"
1575 | },
1576 | {
1577 | "name": "Kore Nordmann",
1578 | "email": "mail@kore-nordmann.de"
1579 | }
1580 | ],
1581 | "description": "Diff implementation",
1582 | "homepage": "https://github.com/sebastianbergmann/diff",
1583 | "keywords": [
1584 | "diff",
1585 | "udiff",
1586 | "unidiff",
1587 | "unified diff"
1588 | ],
1589 | "support": {
1590 | "issues": "https://github.com/sebastianbergmann/diff/issues",
1591 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
1592 | },
1593 | "funding": [
1594 | {
1595 | "url": "https://github.com/sebastianbergmann",
1596 | "type": "github"
1597 | }
1598 | ],
1599 | "time": "2020-10-26T13:10:38+00:00"
1600 | },
1601 | {
1602 | "name": "sebastian/environment",
1603 | "version": "5.1.4",
1604 | "source": {
1605 | "type": "git",
1606 | "url": "https://github.com/sebastianbergmann/environment.git",
1607 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
1608 | },
1609 | "dist": {
1610 | "type": "zip",
1611 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
1612 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
1613 | "shasum": ""
1614 | },
1615 | "require": {
1616 | "php": ">=7.3"
1617 | },
1618 | "require-dev": {
1619 | "phpunit/phpunit": "^9.3"
1620 | },
1621 | "suggest": {
1622 | "ext-posix": "*"
1623 | },
1624 | "type": "library",
1625 | "extra": {
1626 | "branch-alias": {
1627 | "dev-master": "5.1-dev"
1628 | }
1629 | },
1630 | "autoload": {
1631 | "classmap": [
1632 | "src/"
1633 | ]
1634 | },
1635 | "notification-url": "https://packagist.org/downloads/",
1636 | "license": [
1637 | "BSD-3-Clause"
1638 | ],
1639 | "authors": [
1640 | {
1641 | "name": "Sebastian Bergmann",
1642 | "email": "sebastian@phpunit.de"
1643 | }
1644 | ],
1645 | "description": "Provides functionality to handle HHVM/PHP environments",
1646 | "homepage": "http://www.github.com/sebastianbergmann/environment",
1647 | "keywords": [
1648 | "Xdebug",
1649 | "environment",
1650 | "hhvm"
1651 | ],
1652 | "support": {
1653 | "issues": "https://github.com/sebastianbergmann/environment/issues",
1654 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
1655 | },
1656 | "funding": [
1657 | {
1658 | "url": "https://github.com/sebastianbergmann",
1659 | "type": "github"
1660 | }
1661 | ],
1662 | "time": "2022-04-03T09:37:03+00:00"
1663 | },
1664 | {
1665 | "name": "sebastian/exporter",
1666 | "version": "4.0.5",
1667 | "source": {
1668 | "type": "git",
1669 | "url": "https://github.com/sebastianbergmann/exporter.git",
1670 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
1671 | },
1672 | "dist": {
1673 | "type": "zip",
1674 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
1675 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
1676 | "shasum": ""
1677 | },
1678 | "require": {
1679 | "php": ">=7.3",
1680 | "sebastian/recursion-context": "^4.0"
1681 | },
1682 | "require-dev": {
1683 | "ext-mbstring": "*",
1684 | "phpunit/phpunit": "^9.3"
1685 | },
1686 | "type": "library",
1687 | "extra": {
1688 | "branch-alias": {
1689 | "dev-master": "4.0-dev"
1690 | }
1691 | },
1692 | "autoload": {
1693 | "classmap": [
1694 | "src/"
1695 | ]
1696 | },
1697 | "notification-url": "https://packagist.org/downloads/",
1698 | "license": [
1699 | "BSD-3-Clause"
1700 | ],
1701 | "authors": [
1702 | {
1703 | "name": "Sebastian Bergmann",
1704 | "email": "sebastian@phpunit.de"
1705 | },
1706 | {
1707 | "name": "Jeff Welch",
1708 | "email": "whatthejeff@gmail.com"
1709 | },
1710 | {
1711 | "name": "Volker Dusch",
1712 | "email": "github@wallbash.com"
1713 | },
1714 | {
1715 | "name": "Adam Harvey",
1716 | "email": "aharvey@php.net"
1717 | },
1718 | {
1719 | "name": "Bernhard Schussek",
1720 | "email": "bschussek@gmail.com"
1721 | }
1722 | ],
1723 | "description": "Provides the functionality to export PHP variables for visualization",
1724 | "homepage": "https://www.github.com/sebastianbergmann/exporter",
1725 | "keywords": [
1726 | "export",
1727 | "exporter"
1728 | ],
1729 | "support": {
1730 | "issues": "https://github.com/sebastianbergmann/exporter/issues",
1731 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
1732 | },
1733 | "funding": [
1734 | {
1735 | "url": "https://github.com/sebastianbergmann",
1736 | "type": "github"
1737 | }
1738 | ],
1739 | "time": "2022-09-14T06:03:37+00:00"
1740 | },
1741 | {
1742 | "name": "sebastian/global-state",
1743 | "version": "5.0.5",
1744 | "source": {
1745 | "type": "git",
1746 | "url": "https://github.com/sebastianbergmann/global-state.git",
1747 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
1748 | },
1749 | "dist": {
1750 | "type": "zip",
1751 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
1752 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
1753 | "shasum": ""
1754 | },
1755 | "require": {
1756 | "php": ">=7.3",
1757 | "sebastian/object-reflector": "^2.0",
1758 | "sebastian/recursion-context": "^4.0"
1759 | },
1760 | "require-dev": {
1761 | "ext-dom": "*",
1762 | "phpunit/phpunit": "^9.3"
1763 | },
1764 | "suggest": {
1765 | "ext-uopz": "*"
1766 | },
1767 | "type": "library",
1768 | "extra": {
1769 | "branch-alias": {
1770 | "dev-master": "5.0-dev"
1771 | }
1772 | },
1773 | "autoload": {
1774 | "classmap": [
1775 | "src/"
1776 | ]
1777 | },
1778 | "notification-url": "https://packagist.org/downloads/",
1779 | "license": [
1780 | "BSD-3-Clause"
1781 | ],
1782 | "authors": [
1783 | {
1784 | "name": "Sebastian Bergmann",
1785 | "email": "sebastian@phpunit.de"
1786 | }
1787 | ],
1788 | "description": "Snapshotting of global state",
1789 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
1790 | "keywords": [
1791 | "global state"
1792 | ],
1793 | "support": {
1794 | "issues": "https://github.com/sebastianbergmann/global-state/issues",
1795 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
1796 | },
1797 | "funding": [
1798 | {
1799 | "url": "https://github.com/sebastianbergmann",
1800 | "type": "github"
1801 | }
1802 | ],
1803 | "time": "2022-02-14T08:28:10+00:00"
1804 | },
1805 | {
1806 | "name": "sebastian/lines-of-code",
1807 | "version": "1.0.3",
1808 | "source": {
1809 | "type": "git",
1810 | "url": "https://github.com/sebastianbergmann/lines-of-code.git",
1811 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
1812 | },
1813 | "dist": {
1814 | "type": "zip",
1815 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1816 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1817 | "shasum": ""
1818 | },
1819 | "require": {
1820 | "nikic/php-parser": "^4.6",
1821 | "php": ">=7.3"
1822 | },
1823 | "require-dev": {
1824 | "phpunit/phpunit": "^9.3"
1825 | },
1826 | "type": "library",
1827 | "extra": {
1828 | "branch-alias": {
1829 | "dev-master": "1.0-dev"
1830 | }
1831 | },
1832 | "autoload": {
1833 | "classmap": [
1834 | "src/"
1835 | ]
1836 | },
1837 | "notification-url": "https://packagist.org/downloads/",
1838 | "license": [
1839 | "BSD-3-Clause"
1840 | ],
1841 | "authors": [
1842 | {
1843 | "name": "Sebastian Bergmann",
1844 | "email": "sebastian@phpunit.de",
1845 | "role": "lead"
1846 | }
1847 | ],
1848 | "description": "Library for counting the lines of code in PHP source code",
1849 | "homepage": "https://github.com/sebastianbergmann/lines-of-code",
1850 | "support": {
1851 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
1852 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
1853 | },
1854 | "funding": [
1855 | {
1856 | "url": "https://github.com/sebastianbergmann",
1857 | "type": "github"
1858 | }
1859 | ],
1860 | "time": "2020-11-28T06:42:11+00:00"
1861 | },
1862 | {
1863 | "name": "sebastian/object-enumerator",
1864 | "version": "4.0.4",
1865 | "source": {
1866 | "type": "git",
1867 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1868 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
1869 | },
1870 | "dist": {
1871 | "type": "zip",
1872 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
1873 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
1874 | "shasum": ""
1875 | },
1876 | "require": {
1877 | "php": ">=7.3",
1878 | "sebastian/object-reflector": "^2.0",
1879 | "sebastian/recursion-context": "^4.0"
1880 | },
1881 | "require-dev": {
1882 | "phpunit/phpunit": "^9.3"
1883 | },
1884 | "type": "library",
1885 | "extra": {
1886 | "branch-alias": {
1887 | "dev-master": "4.0-dev"
1888 | }
1889 | },
1890 | "autoload": {
1891 | "classmap": [
1892 | "src/"
1893 | ]
1894 | },
1895 | "notification-url": "https://packagist.org/downloads/",
1896 | "license": [
1897 | "BSD-3-Clause"
1898 | ],
1899 | "authors": [
1900 | {
1901 | "name": "Sebastian Bergmann",
1902 | "email": "sebastian@phpunit.de"
1903 | }
1904 | ],
1905 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1906 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1907 | "support": {
1908 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
1909 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
1910 | },
1911 | "funding": [
1912 | {
1913 | "url": "https://github.com/sebastianbergmann",
1914 | "type": "github"
1915 | }
1916 | ],
1917 | "time": "2020-10-26T13:12:34+00:00"
1918 | },
1919 | {
1920 | "name": "sebastian/object-reflector",
1921 | "version": "2.0.4",
1922 | "source": {
1923 | "type": "git",
1924 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
1925 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
1926 | },
1927 | "dist": {
1928 | "type": "zip",
1929 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
1930 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
1931 | "shasum": ""
1932 | },
1933 | "require": {
1934 | "php": ">=7.3"
1935 | },
1936 | "require-dev": {
1937 | "phpunit/phpunit": "^9.3"
1938 | },
1939 | "type": "library",
1940 | "extra": {
1941 | "branch-alias": {
1942 | "dev-master": "2.0-dev"
1943 | }
1944 | },
1945 | "autoload": {
1946 | "classmap": [
1947 | "src/"
1948 | ]
1949 | },
1950 | "notification-url": "https://packagist.org/downloads/",
1951 | "license": [
1952 | "BSD-3-Clause"
1953 | ],
1954 | "authors": [
1955 | {
1956 | "name": "Sebastian Bergmann",
1957 | "email": "sebastian@phpunit.de"
1958 | }
1959 | ],
1960 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
1961 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
1962 | "support": {
1963 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
1964 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
1965 | },
1966 | "funding": [
1967 | {
1968 | "url": "https://github.com/sebastianbergmann",
1969 | "type": "github"
1970 | }
1971 | ],
1972 | "time": "2020-10-26T13:14:26+00:00"
1973 | },
1974 | {
1975 | "name": "sebastian/recursion-context",
1976 | "version": "4.0.4",
1977 | "source": {
1978 | "type": "git",
1979 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
1980 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
1981 | },
1982 | "dist": {
1983 | "type": "zip",
1984 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
1985 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
1986 | "shasum": ""
1987 | },
1988 | "require": {
1989 | "php": ">=7.3"
1990 | },
1991 | "require-dev": {
1992 | "phpunit/phpunit": "^9.3"
1993 | },
1994 | "type": "library",
1995 | "extra": {
1996 | "branch-alias": {
1997 | "dev-master": "4.0-dev"
1998 | }
1999 | },
2000 | "autoload": {
2001 | "classmap": [
2002 | "src/"
2003 | ]
2004 | },
2005 | "notification-url": "https://packagist.org/downloads/",
2006 | "license": [
2007 | "BSD-3-Clause"
2008 | ],
2009 | "authors": [
2010 | {
2011 | "name": "Sebastian Bergmann",
2012 | "email": "sebastian@phpunit.de"
2013 | },
2014 | {
2015 | "name": "Jeff Welch",
2016 | "email": "whatthejeff@gmail.com"
2017 | },
2018 | {
2019 | "name": "Adam Harvey",
2020 | "email": "aharvey@php.net"
2021 | }
2022 | ],
2023 | "description": "Provides functionality to recursively process PHP variables",
2024 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2025 | "support": {
2026 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
2027 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
2028 | },
2029 | "funding": [
2030 | {
2031 | "url": "https://github.com/sebastianbergmann",
2032 | "type": "github"
2033 | }
2034 | ],
2035 | "time": "2020-10-26T13:17:30+00:00"
2036 | },
2037 | {
2038 | "name": "sebastian/resource-operations",
2039 | "version": "3.0.3",
2040 | "source": {
2041 | "type": "git",
2042 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
2043 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
2044 | },
2045 | "dist": {
2046 | "type": "zip",
2047 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2048 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2049 | "shasum": ""
2050 | },
2051 | "require": {
2052 | "php": ">=7.3"
2053 | },
2054 | "require-dev": {
2055 | "phpunit/phpunit": "^9.0"
2056 | },
2057 | "type": "library",
2058 | "extra": {
2059 | "branch-alias": {
2060 | "dev-master": "3.0-dev"
2061 | }
2062 | },
2063 | "autoload": {
2064 | "classmap": [
2065 | "src/"
2066 | ]
2067 | },
2068 | "notification-url": "https://packagist.org/downloads/",
2069 | "license": [
2070 | "BSD-3-Clause"
2071 | ],
2072 | "authors": [
2073 | {
2074 | "name": "Sebastian Bergmann",
2075 | "email": "sebastian@phpunit.de"
2076 | }
2077 | ],
2078 | "description": "Provides a list of PHP built-in functions that operate on resources",
2079 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2080 | "support": {
2081 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
2082 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
2083 | },
2084 | "funding": [
2085 | {
2086 | "url": "https://github.com/sebastianbergmann",
2087 | "type": "github"
2088 | }
2089 | ],
2090 | "time": "2020-09-28T06:45:17+00:00"
2091 | },
2092 | {
2093 | "name": "sebastian/type",
2094 | "version": "3.2.0",
2095 | "source": {
2096 | "type": "git",
2097 | "url": "https://github.com/sebastianbergmann/type.git",
2098 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
2099 | },
2100 | "dist": {
2101 | "type": "zip",
2102 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
2103 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
2104 | "shasum": ""
2105 | },
2106 | "require": {
2107 | "php": ">=7.3"
2108 | },
2109 | "require-dev": {
2110 | "phpunit/phpunit": "^9.5"
2111 | },
2112 | "type": "library",
2113 | "extra": {
2114 | "branch-alias": {
2115 | "dev-master": "3.2-dev"
2116 | }
2117 | },
2118 | "autoload": {
2119 | "classmap": [
2120 | "src/"
2121 | ]
2122 | },
2123 | "notification-url": "https://packagist.org/downloads/",
2124 | "license": [
2125 | "BSD-3-Clause"
2126 | ],
2127 | "authors": [
2128 | {
2129 | "name": "Sebastian Bergmann",
2130 | "email": "sebastian@phpunit.de",
2131 | "role": "lead"
2132 | }
2133 | ],
2134 | "description": "Collection of value objects that represent the types of the PHP type system",
2135 | "homepage": "https://github.com/sebastianbergmann/type",
2136 | "support": {
2137 | "issues": "https://github.com/sebastianbergmann/type/issues",
2138 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
2139 | },
2140 | "funding": [
2141 | {
2142 | "url": "https://github.com/sebastianbergmann",
2143 | "type": "github"
2144 | }
2145 | ],
2146 | "time": "2022-09-12T14:47:03+00:00"
2147 | },
2148 | {
2149 | "name": "sebastian/version",
2150 | "version": "3.0.2",
2151 | "source": {
2152 | "type": "git",
2153 | "url": "https://github.com/sebastianbergmann/version.git",
2154 | "reference": "c6c1022351a901512170118436c764e473f6de8c"
2155 | },
2156 | "dist": {
2157 | "type": "zip",
2158 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
2159 | "reference": "c6c1022351a901512170118436c764e473f6de8c",
2160 | "shasum": ""
2161 | },
2162 | "require": {
2163 | "php": ">=7.3"
2164 | },
2165 | "type": "library",
2166 | "extra": {
2167 | "branch-alias": {
2168 | "dev-master": "3.0-dev"
2169 | }
2170 | },
2171 | "autoload": {
2172 | "classmap": [
2173 | "src/"
2174 | ]
2175 | },
2176 | "notification-url": "https://packagist.org/downloads/",
2177 | "license": [
2178 | "BSD-3-Clause"
2179 | ],
2180 | "authors": [
2181 | {
2182 | "name": "Sebastian Bergmann",
2183 | "email": "sebastian@phpunit.de",
2184 | "role": "lead"
2185 | }
2186 | ],
2187 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2188 | "homepage": "https://github.com/sebastianbergmann/version",
2189 | "support": {
2190 | "issues": "https://github.com/sebastianbergmann/version/issues",
2191 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
2192 | },
2193 | "funding": [
2194 | {
2195 | "url": "https://github.com/sebastianbergmann",
2196 | "type": "github"
2197 | }
2198 | ],
2199 | "time": "2020-09-28T06:39:44+00:00"
2200 | },
2201 | {
2202 | "name": "theseer/tokenizer",
2203 | "version": "1.2.1",
2204 | "source": {
2205 | "type": "git",
2206 | "url": "https://github.com/theseer/tokenizer.git",
2207 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
2208 | },
2209 | "dist": {
2210 | "type": "zip",
2211 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
2212 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
2213 | "shasum": ""
2214 | },
2215 | "require": {
2216 | "ext-dom": "*",
2217 | "ext-tokenizer": "*",
2218 | "ext-xmlwriter": "*",
2219 | "php": "^7.2 || ^8.0"
2220 | },
2221 | "type": "library",
2222 | "autoload": {
2223 | "classmap": [
2224 | "src/"
2225 | ]
2226 | },
2227 | "notification-url": "https://packagist.org/downloads/",
2228 | "license": [
2229 | "BSD-3-Clause"
2230 | ],
2231 | "authors": [
2232 | {
2233 | "name": "Arne Blankerts",
2234 | "email": "arne@blankerts.de",
2235 | "role": "Developer"
2236 | }
2237 | ],
2238 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2239 | "support": {
2240 | "issues": "https://github.com/theseer/tokenizer/issues",
2241 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
2242 | },
2243 | "funding": [
2244 | {
2245 | "url": "https://github.com/theseer",
2246 | "type": "github"
2247 | }
2248 | ],
2249 | "time": "2021-07-28T10:34:58+00:00"
2250 | }
2251 | ],
2252 | "aliases": [],
2253 | "minimum-stability": "stable",
2254 | "stability-flags": [],
2255 | "prefer-stable": false,
2256 | "prefer-lowest": false,
2257 | "platform": {
2258 | "php": "^7.2|^8.0|^8.1|^8.2",
2259 | "ext-curl": "*",
2260 | "ext-json": "*",
2261 | "ext-openssl": "*"
2262 | },
2263 | "platform-dev": [],
2264 | "plugin-api-version": "2.3.0"
2265 | }
2266 |
--------------------------------------------------------------------------------