Export Media Library - Version 4.0.0

Version Description

  • Bumped minimum PHP version to 7.4
Download this release

Release Info

Developer andrej.pavlovic
Plugin Icon wp plugin Export Media Library
Version 4.0.0
Comparing to
See all releases

Code changes from version 3.0.1 to 4.0.0

index.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Export Media Library
4
  Plugin URI: https://github.com/massedge/wordpress-plugin-export-media-library
5
  Description: Allows admins to export media library files as a compressed zip archive.
6
- Version: 3.0.1
7
  Author: Mass Edge Inc.
8
  Author URI: https://www.massedge.com/
9
  License: GPL3
3
  Plugin Name: Export Media Library
4
  Plugin URI: https://github.com/massedge/wordpress-plugin-export-media-library
5
  Description: Allows admins to export media library files as a compressed zip archive.
6
+ Version: 4.0.0
7
  Author: Mass Edge Inc.
8
  Author URI: https://www.massedge.com/
9
  License: GPL3
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: andrej.pavlovic
3
  Tags: export media library, download media library, media library, export, download
4
  Requires at least: 4.7.10
5
- Tested up to: 5.3
6
- Requires PHP: 7.1
7
- Stable tag: 3.0.1
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -20,12 +20,24 @@ Allows users to export media library files as a compressed zip archive.
20
  2. Go to Media -> Export via the admin menu to access the Export Media Library page.
21
  3. Adjust form options before proceeding with the export.
22
 
 
 
 
 
 
23
  == Screenshots ==
24
 
25
  1. Export Media Library admin page
26
 
27
  == Changelog ==
28
 
 
 
 
 
 
 
 
29
  = 3.0.1 =
30
  * adjust syntax to ensure plugin compatibility check can run on older php versions (eg. PHP 5.2)
31
  * removed dependency on ext-mbstring by allowing mbstring polyfill to be used as fallback
2
  Contributors: andrej.pavlovic
3
  Tags: export media library, download media library, media library, export, download
4
  Requires at least: 4.7.10
5
+ Tested up to: 6.0
6
+ Requires PHP: 7.4
7
+ Stable tag: 4.0.0
8
  License: GPLv3
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
20
  2. Go to Media -> Export via the admin menu to access the Export Media Library page.
21
  3. Adjust form options before proceeding with the export.
22
 
23
+ == Frequently Asked Questions ==
24
+
25
+ = I am unable to open the generated zip file
26
+ Please try using the [7-Zip](https://www.7-zip.org/) extractor utility if you are having trouble extracting the downloaded zip file. It's free and open source.
27
+
28
  == Screenshots ==
29
 
30
  1. Export Media Library admin page
31
 
32
  == Changelog ==
33
 
34
+ = 4.0.0 =
35
+ * Bumped minimum PHP version to 7.4
36
+
37
+ = 3.1.0 =
38
+ * Bumped `maennchen/ZipStream-PHP` version to `2.1.0`
39
+ * Added FAQ
40
+
41
  = 3.0.1 =
42
  * adjust syntax to ensure plugin compatibility check can run on older php versions (eg. PHP 5.2)
43
  * removed dependency on ext-mbstring by allowing mbstring polyfill to be used as fallback
vendor/autoload.php CHANGED
@@ -2,6 +2,11 @@
2
 
3
  // autoload.php @generated by Composer
4
 
 
 
 
 
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit2f935c889239f09e679be069f42693f4::getLoader();
2
 
3
  // autoload.php @generated by Composer
4
 
5
+ if (PHP_VERSION_ID < 50600) {
6
+ echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
7
+ exit(1);
8
+ }
9
+
10
  require_once __DIR__ . '/composer/autoload_real.php';
11
 
12
+ return ComposerAutoloaderInit813fbec97f3b546062fee9f205d3d393::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -37,57 +37,130 @@ namespace Composer\Autoload;
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see http://www.php-fig.org/psr/psr-0/
41
- * @see http://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
 
 
 
45
  // PSR-4
 
 
 
 
46
  private $prefixLengthsPsr4 = array();
 
 
 
 
47
  private $prefixDirsPsr4 = array();
 
 
 
 
48
  private $fallbackDirsPsr4 = array();
49
 
50
  // PSR-0
 
 
 
 
51
  private $prefixesPsr0 = array();
 
 
 
 
52
  private $fallbackDirsPsr0 = array();
53
 
 
54
  private $useIncludePath = false;
 
 
 
 
 
55
  private $classMap = array();
 
 
56
  private $classMapAuthoritative = false;
 
 
 
 
 
57
  private $missingClasses = array();
 
 
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
63
- return call_user_func_array('array_merge', $this->prefixesPsr0);
64
  }
65
 
66
  return array();
67
  }
68
 
 
 
 
 
69
  public function getPrefixesPsr4()
70
  {
71
  return $this->prefixDirsPsr4;
72
  }
73
 
 
 
 
 
74
  public function getFallbackDirs()
75
  {
76
  return $this->fallbackDirsPsr0;
77
  }
78
 
 
 
 
 
79
  public function getFallbackDirsPsr4()
80
  {
81
  return $this->fallbackDirsPsr4;
82
  }
83
 
 
 
 
 
84
  public function getClassMap()
85
  {
86
  return $this->classMap;
87
  }
88
 
89
  /**
90
- * @param array $classMap Class to filename map
 
 
 
91
  */
92
  public function addClassMap(array $classMap)
93
  {
@@ -102,9 +175,11 @@ class ClassLoader
102
  * Registers a set of PSR-0 directories for a given prefix, either
103
  * appending or prepending to the ones previously set for this prefix.
104
  *
105
- * @param string $prefix The prefix
106
- * @param array|string $paths The PSR-0 root directories
107
- * @param bool $prepend Whether to prepend the directories
 
 
108
  */
109
  public function add($prefix, $paths, $prepend = false)
110
  {
@@ -147,11 +222,13 @@ class ClassLoader
147
  * Registers a set of PSR-4 directories for a given namespace, either
148
  * appending or prepending to the ones previously set for this namespace.
149
  *
150
- * @param string $prefix The prefix/namespace, with trailing '\\'
151
- * @param array|string $paths The PSR-4 base directories
152
- * @param bool $prepend Whether to prepend the directories
153
  *
154
  * @throws \InvalidArgumentException
 
 
155
  */
156
  public function addPsr4($prefix, $paths, $prepend = false)
157
  {
@@ -195,8 +272,10 @@ class ClassLoader
195
  * Registers a set of PSR-0 directories for a given prefix,
196
  * replacing any others previously set for this prefix.
197
  *
198
- * @param string $prefix The prefix
199
- * @param array|string $paths The PSR-0 base directories
 
 
200
  */
201
  public function set($prefix, $paths)
202
  {
@@ -211,10 +290,12 @@ class ClassLoader
211
  * Registers a set of PSR-4 directories for a given namespace,
212
  * replacing any others previously set for this namespace.
213
  *
214
- * @param string $prefix The prefix/namespace, with trailing '\\'
215
- * @param array|string $paths The PSR-4 base directories
216
  *
217
  * @throws \InvalidArgumentException
 
 
218
  */
219
  public function setPsr4($prefix, $paths)
220
  {
@@ -234,6 +315,8 @@ class ClassLoader
234
  * Turns on searching the include path for class files.
235
  *
236
  * @param bool $useIncludePath
 
 
237
  */
238
  public function setUseIncludePath($useIncludePath)
239
  {
@@ -256,6 +339,8 @@ class ClassLoader
256
  * that have not been registered with the class map.
257
  *
258
  * @param bool $classMapAuthoritative
 
 
259
  */
260
  public function setClassMapAuthoritative($classMapAuthoritative)
261
  {
@@ -276,6 +361,8 @@ class ClassLoader
276
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
  *
278
  * @param string|null $apcuPrefix
 
 
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
@@ -296,25 +383,44 @@ class ClassLoader
296
  * Registers this instance as an autoloader.
297
  *
298
  * @param bool $prepend Whether to prepend the autoloader or not
 
 
299
  */
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
306
  * Unregisters this instance as an autoloader.
 
 
307
  */
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
314
  * Loads the given class or interface.
315
  *
316
  * @param string $class The name of the class
317
- * @return bool|null True if loaded, null otherwise
318
  */
319
  public function loadClass($class)
320
  {
@@ -323,6 +429,8 @@ class ClassLoader
323
 
324
  return true;
325
  }
 
 
326
  }
327
 
328
  /**
@@ -367,6 +475,21 @@ class ClassLoader
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
@@ -438,6 +561,10 @@ class ClassLoader
438
  * Scope isolated include.
439
  *
440
  * Prevents access to $this/self from included files.
 
 
 
 
441
  */
442
  function includeFile($file)
443
  {
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see https://www.php-fig.org/psr/psr-0/
41
+ * @see https://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
45
+ /** @var ?string */
46
+ private $vendorDir;
47
+
48
  // PSR-4
49
+ /**
50
+ * @var array[]
51
+ * @psalm-var array<string, array<string, int>>
52
+ */
53
  private $prefixLengthsPsr4 = array();
54
+ /**
55
+ * @var array[]
56
+ * @psalm-var array<string, array<int, string>>
57
+ */
58
  private $prefixDirsPsr4 = array();
59
+ /**
60
+ * @var array[]
61
+ * @psalm-var array<string, string>
62
+ */
63
  private $fallbackDirsPsr4 = array();
64
 
65
  // PSR-0
66
+ /**
67
+ * @var array[]
68
+ * @psalm-var array<string, array<string, string[]>>
69
+ */
70
  private $prefixesPsr0 = array();
71
+ /**
72
+ * @var array[]
73
+ * @psalm-var array<string, string>
74
+ */
75
  private $fallbackDirsPsr0 = array();
76
 
77
+ /** @var bool */
78
  private $useIncludePath = false;
79
+
80
+ /**
81
+ * @var string[]
82
+ * @psalm-var array<string, string>
83
+ */
84
  private $classMap = array();
85
+
86
+ /** @var bool */
87
  private $classMapAuthoritative = false;
88
+
89
+ /**
90
+ * @var bool[]
91
+ * @psalm-var array<string, bool>
92
+ */
93
  private $missingClasses = array();
94
+
95
+ /** @var ?string */
96
  private $apcuPrefix;
97
 
98
+ /**
99
+ * @var self[]
100
+ */
101
+ private static $registeredLoaders = array();
102
+
103
+ /**
104
+ * @param ?string $vendorDir
105
+ */
106
+ public function __construct($vendorDir = null)
107
+ {
108
+ $this->vendorDir = $vendorDir;
109
+ }
110
+
111
+ /**
112
+ * @return string[]
113
+ */
114
  public function getPrefixes()
115
  {
116
  if (!empty($this->prefixesPsr0)) {
117
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
118
  }
119
 
120
  return array();
121
  }
122
 
123
+ /**
124
+ * @return array[]
125
+ * @psalm-return array<string, array<int, string>>
126
+ */
127
  public function getPrefixesPsr4()
128
  {
129
  return $this->prefixDirsPsr4;
130
  }
131
 
132
+ /**
133
+ * @return array[]
134
+ * @psalm-return array<string, string>
135
+ */
136
  public function getFallbackDirs()
137
  {
138
  return $this->fallbackDirsPsr0;
139
  }
140
 
141
+ /**
142
+ * @return array[]
143
+ * @psalm-return array<string, string>
144
+ */
145
  public function getFallbackDirsPsr4()
146
  {
147
  return $this->fallbackDirsPsr4;
148
  }
149
 
150
+ /**
151
+ * @return string[] Array of classname => path
152
+ * @psalm-return array<string, string>
153
+ */
154
  public function getClassMap()
155
  {
156
  return $this->classMap;
157
  }
158
 
159
  /**
160
+ * @param string[] $classMap Class to filename map
161
+ * @psalm-param array<string, string> $classMap
162
+ *
163
+ * @return void
164
  */
165
  public function addClassMap(array $classMap)
166
  {
175
  * Registers a set of PSR-0 directories for a given prefix, either
176
  * appending or prepending to the ones previously set for this prefix.
177
  *
178
+ * @param string $prefix The prefix
179
+ * @param string[]|string $paths The PSR-0 root directories
180
+ * @param bool $prepend Whether to prepend the directories
181
+ *
182
+ * @return void
183
  */
184
  public function add($prefix, $paths, $prepend = false)
185
  {
222
  * Registers a set of PSR-4 directories for a given namespace, either
223
  * appending or prepending to the ones previously set for this namespace.
224
  *
225
+ * @param string $prefix The prefix/namespace, with trailing '\\'
226
+ * @param string[]|string $paths The PSR-4 base directories
227
+ * @param bool $prepend Whether to prepend the directories
228
  *
229
  * @throws \InvalidArgumentException
230
+ *
231
+ * @return void
232
  */
233
  public function addPsr4($prefix, $paths, $prepend = false)
234
  {
272
  * Registers a set of PSR-0 directories for a given prefix,
273
  * replacing any others previously set for this prefix.
274
  *
275
+ * @param string $prefix The prefix
276
+ * @param string[]|string $paths The PSR-0 base directories
277
+ *
278
+ * @return void
279
  */
280
  public function set($prefix, $paths)
281
  {
290
  * Registers a set of PSR-4 directories for a given namespace,
291
  * replacing any others previously set for this namespace.
292
  *
293
+ * @param string $prefix The prefix/namespace, with trailing '\\'
294
+ * @param string[]|string $paths The PSR-4 base directories
295
  *
296
  * @throws \InvalidArgumentException
297
+ *
298
+ * @return void
299
  */
300
  public function setPsr4($prefix, $paths)
301
  {
315
  * Turns on searching the include path for class files.
316
  *
317
  * @param bool $useIncludePath
318
+ *
319
+ * @return void
320
  */
321
  public function setUseIncludePath($useIncludePath)
322
  {
339
  * that have not been registered with the class map.
340
  *
341
  * @param bool $classMapAuthoritative
342
+ *
343
+ * @return void
344
  */
345
  public function setClassMapAuthoritative($classMapAuthoritative)
346
  {
361
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
362
  *
363
  * @param string|null $apcuPrefix
364
+ *
365
+ * @return void
366
  */
367
  public function setApcuPrefix($apcuPrefix)
368
  {
383
  * Registers this instance as an autoloader.
384
  *
385
  * @param bool $prepend Whether to prepend the autoloader or not
386
+ *
387
+ * @return void
388
  */
389
  public function register($prepend = false)
390
  {
391
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
392
+
393
+ if (null === $this->vendorDir) {
394
+ return;
395
+ }
396
+
397
+ if ($prepend) {
398
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
399
+ } else {
400
+ unset(self::$registeredLoaders[$this->vendorDir]);
401
+ self::$registeredLoaders[$this->vendorDir] = $this;
402
+ }
403
  }
404
 
405
  /**
406
  * Unregisters this instance as an autoloader.
407
+ *
408
+ * @return void
409
  */
410
  public function unregister()
411
  {
412
  spl_autoload_unregister(array($this, 'loadClass'));
413
+
414
+ if (null !== $this->vendorDir) {
415
+ unset(self::$registeredLoaders[$this->vendorDir]);
416
+ }
417
  }
418
 
419
  /**
420
  * Loads the given class or interface.
421
  *
422
  * @param string $class The name of the class
423
+ * @return true|null True if loaded, null otherwise
424
  */
425
  public function loadClass($class)
426
  {
429
 
430
  return true;
431
  }
432
+
433
+ return null;
434
  }
435
 
436
  /**
475
  return $file;
476
  }
477
 
478
+ /**
479
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
480
+ *
481
+ * @return self[]
482
+ */
483
+ public static function getRegisteredLoaders()
484
+ {
485
+ return self::$registeredLoaders;
486
+ }
487
+
488
+ /**
489
+ * @param string $class
490
+ * @param string $ext
491
+ * @return string|false
492
+ */
493
  private function findFileWithExtension($class, $ext)
494
  {
495
  // PSR-4 lookup
561
  * Scope isolated include.
562
  *
563
  * Prevents access to $this/self from included files.
564
+ *
565
+ * @param string $file
566
+ * @return void
567
+ * @private
568
  */
569
  function includeFile($file)
570
  {
vendor/composer/InstalledVersions.php ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer;
14
+
15
+ use Composer\Autoload\ClassLoader;
16
+ use Composer\Semver\VersionParser;
17
+
18
+ /**
19
+ * This class is copied in every Composer installed project and available to all
20
+ *
21
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
22
+ *
23
+ * To require its presence, you can require `composer-runtime-api ^2.0`
24
+ *
25
+ * @final
26
+ */
27
+ class InstalledVersions
28
+ {
29
+ /**
30
+ * @var mixed[]|null
31
+ * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
32
+ */
33
+ private static $installed;
34
+
35
+ /**
36
+ * @var bool|null
37
+ */
38
+ private static $canGetVendors;
39
+
40
+ /**
41
+ * @var array[]
42
+ * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
43
+ */
44
+ private static $installedByVendor = array();
45
+
46
+ /**
47
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
48
+ *
49
+ * @return string[]
50
+ * @psalm-return list<string>
51
+ */
52
+ public static function getInstalledPackages()
53
+ {
54
+ $packages = array();
55
+ foreach (self::getInstalled() as $installed) {
56
+ $packages[] = array_keys($installed['versions']);
57
+ }
58
+
59
+ if (1 === \count($packages)) {
60
+ return $packages[0];
61
+ }
62
+
63
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
64
+ }
65
+
66
+ /**
67
+ * Returns a list of all package names with a specific type e.g. 'library'
68
+ *
69
+ * @param string $type
70
+ * @return string[]
71
+ * @psalm-return list<string>
72
+ */
73
+ public static function getInstalledPackagesByType($type)
74
+ {
75
+ $packagesByType = array();
76
+
77
+ foreach (self::getInstalled() as $installed) {
78
+ foreach ($installed['versions'] as $name => $package) {
79
+ if (isset($package['type']) && $package['type'] === $type) {
80
+ $packagesByType[] = $name;
81
+ }
82
+ }
83
+ }
84
+
85
+ return $packagesByType;
86
+ }
87
+
88
+ /**
89
+ * Checks whether the given package is installed
90
+ *
91
+ * This also returns true if the package name is provided or replaced by another package
92
+ *
93
+ * @param string $packageName
94
+ * @param bool $includeDevRequirements
95
+ * @return bool
96
+ */
97
+ public static function isInstalled($packageName, $includeDevRequirements = true)
98
+ {
99
+ foreach (self::getInstalled() as $installed) {
100
+ if (isset($installed['versions'][$packageName])) {
101
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
102
+ }
103
+ }
104
+
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Checks whether the given package satisfies a version constraint
110
+ *
111
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
112
+ *
113
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
114
+ *
115
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
116
+ * @param string $packageName
117
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
118
+ * @return bool
119
+ */
120
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
121
+ {
122
+ $constraint = $parser->parseConstraints($constraint);
123
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
124
+
125
+ return $provided->matches($constraint);
126
+ }
127
+
128
+ /**
129
+ * Returns a version constraint representing all the range(s) which are installed for a given package
130
+ *
131
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
132
+ * whether a given version of a package is installed, and not just whether it exists
133
+ *
134
+ * @param string $packageName
135
+ * @return string Version constraint usable with composer/semver
136
+ */
137
+ public static function getVersionRanges($packageName)
138
+ {
139
+ foreach (self::getInstalled() as $installed) {
140
+ if (!isset($installed['versions'][$packageName])) {
141
+ continue;
142
+ }
143
+
144
+ $ranges = array();
145
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
146
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
147
+ }
148
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
149
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
150
+ }
151
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
152
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
153
+ }
154
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
155
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
156
+ }
157
+
158
+ return implode(' || ', $ranges);
159
+ }
160
+
161
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
162
+ }
163
+
164
+ /**
165
+ * @param string $packageName
166
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
167
+ */
168
+ public static function getVersion($packageName)
169
+ {
170
+ foreach (self::getInstalled() as $installed) {
171
+ if (!isset($installed['versions'][$packageName])) {
172
+ continue;
173
+ }
174
+
175
+ if (!isset($installed['versions'][$packageName]['version'])) {
176
+ return null;
177
+ }
178
+
179
+ return $installed['versions'][$packageName]['version'];
180
+ }
181
+
182
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
183
+ }
184
+
185
+ /**
186
+ * @param string $packageName
187
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
188
+ */
189
+ public static function getPrettyVersion($packageName)
190
+ {
191
+ foreach (self::getInstalled() as $installed) {
192
+ if (!isset($installed['versions'][$packageName])) {
193
+ continue;
194
+ }
195
+
196
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
197
+ return null;
198
+ }
199
+
200
+ return $installed['versions'][$packageName]['pretty_version'];
201
+ }
202
+
203
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
204
+ }
205
+
206
+ /**
207
+ * @param string $packageName
208
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
209
+ */
210
+ public static function getReference($packageName)
211
+ {
212
+ foreach (self::getInstalled() as $installed) {
213
+ if (!isset($installed['versions'][$packageName])) {
214
+ continue;
215
+ }
216
+
217
+ if (!isset($installed['versions'][$packageName]['reference'])) {
218
+ return null;
219
+ }
220
+
221
+ return $installed['versions'][$packageName]['reference'];
222
+ }
223
+
224
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
225
+ }
226
+
227
+ /**
228
+ * @param string $packageName
229
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
230
+ */
231
+ public static function getInstallPath($packageName)
232
+ {
233
+ foreach (self::getInstalled() as $installed) {
234
+ if (!isset($installed['versions'][$packageName])) {
235
+ continue;
236
+ }
237
+
238
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
239
+ }
240
+
241
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
242
+ }
243
+
244
+ /**
245
+ * @return array
246
+ * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
247
+ */
248
+ public static function getRootPackage()
249
+ {
250
+ $installed = self::getInstalled();
251
+
252
+ return $installed[0]['root'];
253
+ }
254
+
255
+ /**
256
+ * Returns the raw installed.php data for custom implementations
257
+ *
258
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
259
+ * @return array[]
260
+ * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
261
+ */
262
+ public static function getRawData()
263
+ {
264
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
265
+
266
+ if (null === self::$installed) {
267
+ // only require the installed.php file if this file is loaded from its dumped location,
268
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
269
+ if (substr(__DIR__, -8, 1) !== 'C') {
270
+ self::$installed = include __DIR__ . '/installed.php';
271
+ } else {
272
+ self::$installed = array();
273
+ }
274
+ }
275
+
276
+ return self::$installed;
277
+ }
278
+
279
+ /**
280
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
281
+ *
282
+ * @return array[]
283
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
284
+ */
285
+ public static function getAllRawData()
286
+ {
287
+ return self::getInstalled();
288
+ }
289
+
290
+ /**
291
+ * Lets you reload the static array from another file
292
+ *
293
+ * This is only useful for complex integrations in which a project needs to use
294
+ * this class but then also needs to execute another project's autoloader in process,
295
+ * and wants to ensure both projects have access to their version of installed.php.
296
+ *
297
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
298
+ * the data it needs from this class, then call reload() with
299
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
300
+ * the project in which it runs can then also use this class safely, without
301
+ * interference between PHPUnit's dependencies and the project's dependencies.
302
+ *
303
+ * @param array[] $data A vendor/composer/installed.php data set
304
+ * @return void
305
+ *
306
+ * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
307
+ */
308
+ public static function reload($data)
309
+ {
310
+ self::$installed = $data;
311
+ self::$installedByVendor = array();
312
+ }
313
+
314
+ /**
315
+ * @return array[]
316
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
317
+ */
318
+ private static function getInstalled()
319
+ {
320
+ if (null === self::$canGetVendors) {
321
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
322
+ }
323
+
324
+ $installed = array();
325
+
326
+ if (self::$canGetVendors) {
327
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
328
+ if (isset(self::$installedByVendor[$vendorDir])) {
329
+ $installed[] = self::$installedByVendor[$vendorDir];
330
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
331
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
332
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
333
+ self::$installed = $installed[count($installed) - 1];
334
+ }
335
+ }
336
+ }
337
+ }
338
+
339
+ if (null === self::$installed) {
340
+ // only require the installed.php file if this file is loaded from its dumped location,
341
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
342
+ if (substr(__DIR__, -8, 1) !== 'C') {
343
+ self::$installed = require __DIR__ . '/installed.php';
344
+ } else {
345
+ self::$installed = array();
346
+ }
347
+ }
348
+ $installed[] = self::$installed;
349
+
350
+ return $installed;
351
+ }
352
+ }
vendor/composer/autoload_classmap.php CHANGED
@@ -2,8 +2,10 @@
2
 
3
  // autoload_classmap.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
9
  );
2
 
3
  // autoload_classmap.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10
+ 'Stringable' => $vendorDir . '/myclabs/php-enum/stubs/Stringable.php',
11
  );
vendor/composer/autoload_files.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_files.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
2
 
3
  // autoload_files.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
vendor/composer/autoload_namespaces.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_namespaces.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
2
 
3
  // autoload_namespaces.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
vendor/composer/autoload_psr4.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_psr4.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
2
 
3
  // autoload_psr4.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit2f935c889239f09e679be069f42693f4
6
  {
7
  private static $loader;
8
 
@@ -13,58 +13,45 @@ class ComposerAutoloaderInit2f935c889239f09e679be069f42693f4
13
  }
14
  }
15
 
 
 
 
16
  public static function getLoader()
17
  {
18
  if (null !== self::$loader) {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit2f935c889239f09e679be069f42693f4', 'loadClassLoader'), true, true);
23
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit2f935c889239f09e679be069f42693f4', 'loadClassLoader'));
25
 
26
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
- if ($useStaticLoader) {
28
- require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit2f935c889239f09e679be069f42693f4::getInitializer($loader));
31
- } else {
32
- $map = require __DIR__ . '/autoload_namespaces.php';
33
- foreach ($map as $namespace => $path) {
34
- $loader->set($namespace, $path);
35
- }
36
-
37
- $map = require __DIR__ . '/autoload_psr4.php';
38
- foreach ($map as $namespace => $path) {
39
- $loader->setPsr4($namespace, $path);
40
- }
41
-
42
- $classMap = require __DIR__ . '/autoload_classmap.php';
43
- if ($classMap) {
44
- $loader->addClassMap($classMap);
45
- }
46
- }
47
 
48
  $loader->register(true);
49
 
50
- if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit2f935c889239f09e679be069f42693f4::$files;
52
- } else {
53
- $includeFiles = require __DIR__ . '/autoload_files.php';
54
- }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire2f935c889239f09e679be069f42693f4($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire2f935c889239f09e679be069f42693f4($fileIdentifier, $file)
 
 
 
 
 
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
- require $file;
67
-
68
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
 
 
69
  }
70
  }
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit813fbec97f3b546062fee9f205d3d393
6
  {
7
  private static $loader;
8
 
13
  }
14
  }
15
 
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
  public static function getLoader()
20
  {
21
  if (null !== self::$loader) {
22
  return self::$loader;
23
  }
24
 
25
+ require __DIR__ . '/platform_check.php';
 
 
26
 
27
+ spl_autoload_register(array('ComposerAutoloaderInit813fbec97f3b546062fee9f205d3d393', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit813fbec97f3b546062fee9f205d3d393', 'loadClassLoader'));
30
 
31
+ require __DIR__ . '/autoload_static.php';
32
+ call_user_func(\Composer\Autoload\ComposerStaticInit813fbec97f3b546062fee9f205d3d393::getInitializer($loader));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  $loader->register(true);
35
 
36
+ $includeFiles = \Composer\Autoload\ComposerStaticInit813fbec97f3b546062fee9f205d3d393::$files;
 
 
 
 
37
  foreach ($includeFiles as $fileIdentifier => $file) {
38
+ composerRequire813fbec97f3b546062fee9f205d3d393($fileIdentifier, $file);
39
  }
40
 
41
  return $loader;
42
  }
43
  }
44
 
45
+ /**
46
+ * @param string $fileIdentifier
47
+ * @param string $file
48
+ * @return void
49
+ */
50
+ function composerRequire813fbec97f3b546062fee9f205d3d393($fileIdentifier, $file)
51
  {
52
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
 
 
53
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
54
+
55
+ require $file;
56
  }
57
  }
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit2f935c889239f09e679be069f42693f4
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@@ -52,12 +52,18 @@ class ComposerStaticInit2f935c889239f09e679be069f42693f4
52
  0 => __DIR__ . '/../..' . '/lib',
53
  );
54
 
 
 
 
 
 
55
  public static function getInitializer(ClassLoader $loader)
56
  {
57
  return \Closure::bind(function () use ($loader) {
58
- $loader->prefixLengthsPsr4 = ComposerStaticInit2f935c889239f09e679be069f42693f4::$prefixLengthsPsr4;
59
- $loader->prefixDirsPsr4 = ComposerStaticInit2f935c889239f09e679be069f42693f4::$prefixDirsPsr4;
60
- $loader->fallbackDirsPsr4 = ComposerStaticInit2f935c889239f09e679be069f42693f4::$fallbackDirsPsr4;
 
61
 
62
  }, null, ClassLoader::class);
63
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit813fbec97f3b546062fee9f205d3d393
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
52
  0 => __DIR__ . '/../..' . '/lib',
53
  );
54
 
55
+ public static $classMap = array (
56
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
57
+ 'Stringable' => __DIR__ . '/..' . '/myclabs/php-enum/stubs/Stringable.php',
58
+ );
59
+
60
  public static function getInitializer(ClassLoader $loader)
61
  {
62
  return \Closure::bind(function () use ($loader) {
63
+ $loader->prefixLengthsPsr4 = ComposerStaticInit813fbec97f3b546062fee9f205d3d393::$prefixLengthsPsr4;
64
+ $loader->prefixDirsPsr4 = ComposerStaticInit813fbec97f3b546062fee9f205d3d393::$prefixDirsPsr4;
65
+ $loader->fallbackDirsPsr4 = ComposerStaticInit813fbec97f3b546062fee9f205d3d393::$fallbackDirsPsr4;
66
+ $loader->classMap = ComposerStaticInit813fbec97f3b546062fee9f205d3d393::$classMap;
67
 
68
  }, null, ClassLoader::class);
69
  }
vendor/composer/installed.json CHANGED
@@ -1,228 +1,285 @@
1
- [
2
- {
3
- "name": "maennchen/zipstream-php",
4
- "version": "dev-massedge-wp-eml",
5
- "version_normalized": "dev-massedge-wp-eml",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/massedge/ZipStream-PHP.git",
9
- "reference": "2c3cc0c80e0191b0017c0f4adb48f01303deb46f"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/massedge/ZipStream-PHP/zipball/2c3cc0c80e0191b0017c0f4adb48f01303deb46f",
14
- "reference": "2c3cc0c80e0191b0017c0f4adb48f01303deb46f",
15
- "shasum": ""
16
- },
17
- "require": {
18
- "myclabs/php-enum": "^1.5",
19
- "php": ">= 7.1",
20
- "psr/http-message": "^1.0",
21
- "symfony/polyfill-mbstring": "^1.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  },
23
- "require-dev": {
24
- "ext-zip": "*",
25
- "guzzlehttp/guzzle": ">= 6.3",
26
- "mikey179/vfsstream": "^1.6",
27
- "phpunit/phpunit": ">= 7.5"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  },
29
- "time": "2020-05-28T17:18:27+00:00",
30
- "type": "library",
31
- "installation-source": "source",
32
- "autoload": {
33
- "psr-4": {
34
- "ZipStream\\": "src/"
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  },
37
- "license": [
38
- "MIT"
39
- ],
40
- "authors": [
41
- {
42
- "name": "Paul Duncan",
43
- "email": "pabs@pablotron.org"
44
- },
45
- {
46
- "name": "Jonatan Männchen",
47
- "email": "jonatan@maennchen.ch"
48
- },
49
- {
50
- "name": "Jesse Donat",
51
- "email": "donatj@gmail.com"
52
- },
53
- {
54
- "name": "András Kolesár",
55
- "email": "kolesar@kolesar.hu"
56
- }
57
- ],
58
- "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
59
- "keywords": [
60
- "stream",
61
- "zip"
62
- ],
63
- "support": {
64
- "source": "https://github.com/massedge/ZipStream-PHP/tree/massedge-wp-eml"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
- },
67
- {
68
- "name": "myclabs/php-enum",
69
- "version": "1.7.6",
70
- "version_normalized": "1.7.6.0",
71
- "source": {
72
- "type": "git",
73
- "url": "https://github.com/myclabs/php-enum.git",
74
- "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c"
75
- },
76
- "dist": {
77
- "type": "zip",
78
- "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c",
79
- "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c",
80
- "shasum": ""
81
- },
82
- "require": {
83
- "ext-json": "*",
84
- "php": ">=7.1"
85
- },
86
- "require-dev": {
87
- "phpunit/phpunit": "^7",
88
- "squizlabs/php_codesniffer": "1.*",
89
- "vimeo/psalm": "^3.8"
90
- },
91
- "time": "2020-02-14T08:15:52+00:00",
92
- "type": "library",
93
- "installation-source": "dist",
94
- "autoload": {
95
- "psr-4": {
96
- "MyCLabs\\Enum\\": "src/"
97
- }
98
- },
99
- "notification-url": "https://packagist.org/downloads/",
100
- "license": [
101
- "MIT"
102
- ],
103
- "authors": [
104
- {
105
- "name": "PHP Enum contributors",
106
- "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
107
- }
108
- ],
109
- "description": "PHP Enum implementation",
110
- "homepage": "http://github.com/myclabs/php-enum",
111
- "keywords": [
112
- "enum"
113
- ]
114
- },
115
- {
116
- "name": "psr/http-message",
117
- "version": "1.0.1",
118
- "version_normalized": "1.0.1.0",
119
- "source": {
120
- "type": "git",
121
- "url": "https://github.com/php-fig/http-message.git",
122
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
123
- },
124
- "dist": {
125
- "type": "zip",
126
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
127
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
128
- "shasum": ""
129
- },
130
- "require": {
131
- "php": ">=5.3.0"
132
- },
133
- "time": "2016-08-06T14:39:51+00:00",
134
- "type": "library",
135
- "extra": {
136
- "branch-alias": {
137
- "dev-master": "1.0.x-dev"
138
- }
139
- },
140
- "installation-source": "dist",
141
- "autoload": {
142
- "psr-4": {
143
- "Psr\\Http\\Message\\": "src/"
144
- }
145
- },
146
- "notification-url": "https://packagist.org/downloads/",
147
- "license": [
148
- "MIT"
149
- ],
150
- "authors": [
151
- {
152
- "name": "PHP-FIG",
153
- "homepage": "http://www.php-fig.org/"
154
- }
155
- ],
156
- "description": "Common interface for HTTP messages",
157
- "homepage": "https://github.com/php-fig/http-message",
158
- "keywords": [
159
- "http",
160
- "http-message",
161
- "psr",
162
- "psr-7",
163
- "request",
164
- "response"
165
- ]
166
- },
167
- {
168
- "name": "symfony/polyfill-mbstring",
169
- "version": "v1.17.0",
170
- "version_normalized": "1.17.0.0",
171
- "source": {
172
- "type": "git",
173
- "url": "https://github.com/symfony/polyfill-mbstring.git",
174
- "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
175
- },
176
- "dist": {
177
- "type": "zip",
178
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
179
- "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
180
- "shasum": ""
181
- },
182
- "require": {
183
- "php": ">=5.3.3"
184
- },
185
- "suggest": {
186
- "ext-mbstring": "For best performance"
187
- },
188
- "time": "2020-05-12T16:47:27+00:00",
189
- "type": "library",
190
- "extra": {
191
- "branch-alias": {
192
- "dev-master": "1.17-dev"
193
- }
194
- },
195
- "installation-source": "dist",
196
- "autoload": {
197
- "psr-4": {
198
- "Symfony\\Polyfill\\Mbstring\\": ""
199
- },
200
- "files": [
201
- "bootstrap.php"
202
- ]
203
- },
204
- "notification-url": "https://packagist.org/downloads/",
205
- "license": [
206
- "MIT"
207
- ],
208
- "authors": [
209
- {
210
- "name": "Nicolas Grekas",
211
- "email": "p@tchwork.com"
212
- },
213
- {
214
- "name": "Symfony Community",
215
- "homepage": "https://symfony.com/contributors"
216
- }
217
- ],
218
- "description": "Symfony polyfill for the Mbstring extension",
219
- "homepage": "https://symfony.com",
220
- "keywords": [
221
- "compatibility",
222
- "mbstring",
223
- "polyfill",
224
- "portable",
225
- "shim"
226
- ]
227
- }
228
- ]
1
+ {
2
+ "packages": [
3
+ {
4
+ "name": "maennchen/zipstream-php",
5
+ "version": "2.1.0",
6
+ "version_normalized": "2.1.0.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
10
+ "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58"
11
+ },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58",
15
+ "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "myclabs/php-enum": "^1.5",
20
+ "php": ">= 7.1",
21
+ "psr/http-message": "^1.0",
22
+ "symfony/polyfill-mbstring": "^1.0"
23
+ },
24
+ "require-dev": {
25
+ "ext-zip": "*",
26
+ "guzzlehttp/guzzle": ">= 6.3",
27
+ "mikey179/vfsstream": "^1.6",
28
+ "phpunit/phpunit": ">= 7.5"
29
+ },
30
+ "time": "2020-05-30T13:11:16+00:00",
31
+ "type": "library",
32
+ "installation-source": "dist",
33
+ "autoload": {
34
+ "psr-4": {
35
+ "ZipStream\\": "src/"
36
+ }
37
+ },
38
+ "notification-url": "https://packagist.org/downloads/",
39
+ "license": [
40
+ "MIT"
41
+ ],
42
+ "authors": [
43
+ {
44
+ "name": "Paul Duncan",
45
+ "email": "pabs@pablotron.org"
46
+ },
47
+ {
48
+ "name": "Jonatan Männchen",
49
+ "email": "jonatan@maennchen.ch"
50
+ },
51
+ {
52
+ "name": "Jesse Donat",
53
+ "email": "donatj@gmail.com"
54
+ },
55
+ {
56
+ "name": "András Kolesár",
57
+ "email": "kolesar@kolesar.hu"
58
+ }
59
+ ],
60
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
61
+ "keywords": [
62
+ "stream",
63
+ "zip"
64
+ ],
65
+ "support": {
66
+ "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
67
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/master"
68
+ },
69
+ "funding": [
70
+ {
71
+ "url": "https://opencollective.com/zipstream",
72
+ "type": "open_collective"
73
+ }
74
+ ],
75
+ "install-path": "../maennchen/zipstream-php"
76
  },
77
+ {
78
+ "name": "myclabs/php-enum",
79
+ "version": "1.8.4",
80
+ "version_normalized": "1.8.4.0",
81
+ "source": {
82
+ "type": "git",
83
+ "url": "https://github.com/myclabs/php-enum.git",
84
+ "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483"
85
+ },
86
+ "dist": {
87
+ "type": "zip",
88
+ "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483",
89
+ "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483",
90
+ "shasum": ""
91
+ },
92
+ "require": {
93
+ "ext-json": "*",
94
+ "php": "^7.3 || ^8.0"
95
+ },
96
+ "require-dev": {
97
+ "phpunit/phpunit": "^9.5",
98
+ "squizlabs/php_codesniffer": "1.*",
99
+ "vimeo/psalm": "^4.6.2"
100
+ },
101
+ "time": "2022-08-04T09:53:51+00:00",
102
+ "type": "library",
103
+ "installation-source": "dist",
104
+ "autoload": {
105
+ "psr-4": {
106
+ "MyCLabs\\Enum\\": "src/"
107
+ },
108
+ "classmap": [
109
+ "stubs/Stringable.php"
110
+ ]
111
+ },
112
+ "notification-url": "https://packagist.org/downloads/",
113
+ "license": [
114
+ "MIT"
115
+ ],
116
+ "authors": [
117
+ {
118
+ "name": "PHP Enum contributors",
119
+ "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
120
+ }
121
+ ],
122
+ "description": "PHP Enum implementation",
123
+ "homepage": "http://github.com/myclabs/php-enum",
124
+ "keywords": [
125
+ "enum"
126
+ ],
127
+ "support": {
128
+ "issues": "https://github.com/myclabs/php-enum/issues",
129
+ "source": "https://github.com/myclabs/php-enum/tree/1.8.4"
130
+ },
131
+ "funding": [
132
+ {
133
+ "url": "https://github.com/mnapoli",
134
+ "type": "github"
135
+ },
136
+ {
137
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
138
+ "type": "tidelift"
139
+ }
140
+ ],
141
+ "install-path": "../myclabs/php-enum"
142
  },
143
+ {
144
+ "name": "psr/http-message",
145
+ "version": "1.0.1",
146
+ "version_normalized": "1.0.1.0",
147
+ "source": {
148
+ "type": "git",
149
+ "url": "https://github.com/php-fig/http-message.git",
150
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
151
+ },
152
+ "dist": {
153
+ "type": "zip",
154
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
155
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
156
+ "shasum": ""
157
+ },
158
+ "require": {
159
+ "php": ">=5.3.0"
160
+ },
161
+ "time": "2016-08-06T14:39:51+00:00",
162
+ "type": "library",
163
+ "extra": {
164
+ "branch-alias": {
165
+ "dev-master": "1.0.x-dev"
166
+ }
167
+ },
168
+ "installation-source": "dist",
169
+ "autoload": {
170
+ "psr-4": {
171
+ "Psr\\Http\\Message\\": "src/"
172
+ }
173
+ },
174
+ "notification-url": "https://packagist.org/downloads/",
175
+ "license": [
176
+ "MIT"
177
+ ],
178
+ "authors": [
179
+ {
180
+ "name": "PHP-FIG",
181
+ "homepage": "http://www.php-fig.org/"
182
+ }
183
+ ],
184
+ "description": "Common interface for HTTP messages",
185
+ "homepage": "https://github.com/php-fig/http-message",
186
+ "keywords": [
187
+ "http",
188
+ "http-message",
189
+ "psr",
190
+ "psr-7",
191
+ "request",
192
+ "response"
193
+ ],
194
+ "install-path": "../psr/http-message"
195
  },
196
+ {
197
+ "name": "symfony/polyfill-mbstring",
198
+ "version": "v1.26.0",
199
+ "version_normalized": "1.26.0.0",
200
+ "source": {
201
+ "type": "git",
202
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
203
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
204
+ },
205
+ "dist": {
206
+ "type": "zip",
207
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
208
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
209
+ "shasum": ""
210
+ },
211
+ "require": {
212
+ "php": ">=7.1"
213
+ },
214
+ "provide": {
215
+ "ext-mbstring": "*"
216
+ },
217
+ "suggest": {
218
+ "ext-mbstring": "For best performance"
219
+ },
220
+ "time": "2022-05-24T11:49:31+00:00",
221
+ "type": "library",
222
+ "extra": {
223
+ "branch-alias": {
224
+ "dev-main": "1.26-dev"
225
+ },
226
+ "thanks": {
227
+ "name": "symfony/polyfill",
228
+ "url": "https://github.com/symfony/polyfill"
229
+ }
230
+ },
231
+ "installation-source": "dist",
232
+ "autoload": {
233
+ "files": [
234
+ "bootstrap.php"
235
+ ],
236
+ "psr-4": {
237
+ "Symfony\\Polyfill\\Mbstring\\": ""
238
+ }
239
+ },
240
+ "notification-url": "https://packagist.org/downloads/",
241
+ "license": [
242
+ "MIT"
243
+ ],
244
+ "authors": [
245
+ {
246
+ "name": "Nicolas Grekas",
247
+ "email": "p@tchwork.com"
248
+ },
249
+ {
250
+ "name": "Symfony Community",
251
+ "homepage": "https://symfony.com/contributors"
252
+ }
253
+ ],
254
+ "description": "Symfony polyfill for the Mbstring extension",
255
+ "homepage": "https://symfony.com",
256
+ "keywords": [
257
+ "compatibility",
258
+ "mbstring",
259
+ "polyfill",
260
+ "portable",
261
+ "shim"
262
+ ],
263
+ "support": {
264
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
265
+ },
266
+ "funding": [
267
+ {
268
+ "url": "https://symfony.com/sponsor",
269
+ "type": "custom"
270
+ },
271
+ {
272
+ "url": "https://github.com/fabpot",
273
+ "type": "github"
274
+ },
275
+ {
276
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
277
+ "type": "tidelift"
278
+ }
279
+ ],
280
+ "install-path": "../symfony/polyfill-mbstring"
281
  }
282
+ ],
283
+ "dev": true,
284
+ "dev-package-names": []
285
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/composer/installed.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php return array(
2
+ 'root' => array(
3
+ 'name' => 'massedge/wordpress-plugin-export-media-library',
4
+ 'pretty_version' => '4.0.0',
5
+ 'version' => '4.0.0.0',
6
+ 'reference' => NULL,
7
+ 'type' => 'wordpress-plugin',
8
+ 'install_path' => __DIR__ . '/../../',
9
+ 'aliases' => array(),
10
+ 'dev' => true,
11
+ ),
12
+ 'versions' => array(
13
+ 'maennchen/zipstream-php' => array(
14
+ 'pretty_version' => '2.1.0',
15
+ 'version' => '2.1.0.0',
16
+ 'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58',
17
+ 'type' => 'library',
18
+ 'install_path' => __DIR__ . '/../maennchen/zipstream-php',
19
+ 'aliases' => array(),
20
+ 'dev_requirement' => false,
21
+ ),
22
+ 'massedge/wordpress-plugin-export-media-library' => array(
23
+ 'pretty_version' => '4.0.0',
24
+ 'version' => '4.0.0.0',
25
+ 'reference' => NULL,
26
+ 'type' => 'wordpress-plugin',
27
+ 'install_path' => __DIR__ . '/../../',
28
+ 'aliases' => array(),
29
+ 'dev_requirement' => false,
30
+ ),
31
+ 'myclabs/php-enum' => array(
32
+ 'pretty_version' => '1.8.4',
33
+ 'version' => '1.8.4.0',
34
+ 'reference' => 'a867478eae49c9f59ece437ae7f9506bfaa27483',
35
+ 'type' => 'library',
36
+ 'install_path' => __DIR__ . '/../myclabs/php-enum',
37
+ 'aliases' => array(),
38
+ 'dev_requirement' => false,
39
+ ),
40
+ 'psr/http-message' => array(
41
+ 'pretty_version' => '1.0.1',
42
+ 'version' => '1.0.1.0',
43
+ 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
44
+ 'type' => 'library',
45
+ 'install_path' => __DIR__ . '/../psr/http-message',
46
+ 'aliases' => array(),
47
+ 'dev_requirement' => false,
48
+ ),
49
+ 'symfony/polyfill-mbstring' => array(
50
+ 'pretty_version' => 'v1.26.0',
51
+ 'version' => '1.26.0.0',
52
+ 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
53
+ 'type' => 'library',
54
+ 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
55
+ 'aliases' => array(),
56
+ 'dev_requirement' => false,
57
+ ),
58
+ ),
59
+ );
vendor/composer/platform_check.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // platform_check.php @generated by Composer
4
+
5
+ $issues = array();
6
+
7
+ if (!(PHP_VERSION_ID >= 70400)) {
8
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
9
+ }
10
+
11
+ if ($issues) {
12
+ if (!headers_sent()) {
13
+ header('HTTP/1.1 500 Internal Server Error');
14
+ }
15
+ if (!ini_get('display_errors')) {
16
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17
+ fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18
+ } elseif (!headers_sent()) {
19
+ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20
+ }
21
+ }
22
+ trigger_error(
23
+ 'Composer detected issues in your platform: ' . implode(' ', $issues),
24
+ E_USER_ERROR
25
+ );
26
+ }
vendor/maennchen/zipstream-php/.github/FUNDING.yml ADDED
@@ -0,0 +1 @@
 
1
+ open_collective: zipstream
vendor/maennchen/zipstream-php/.github/ISSUE_TEMPLATE.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Description of the problem
2
+
3
+ Please be very descriptive and include as much details as possible.
4
+
5
+ # Example code
6
+
7
+ # Informations
8
+
9
+ * ZipStream-PHP version:
10
+ * PHP version:
11
+
12
+ Please include any supplemental information you deem relevant to this issue.
vendor/maennchen/zipstream-php/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
 
 
 
 
 
 
 
 
8
  ## [2.0.0] - 2020-02-22
9
  ### Breaking change
10
  - Only the self opened streams will be closed (#139)
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
 
8
+ ## [2.1.0] - 2020-06-01
9
+ ### Changed
10
+ - Don't execute ob_flush() when output buffering is not enabled (#152)
11
+ - Fix inconsistent return type on 32-bit systems (#149) Fix #144
12
+ - Use mbstring polyfill (#151)
13
+ - Promote 7zip usage over unzip to avoid UTF-8 issues (#147)
14
+
15
  ## [2.0.0] - 2020-02-22
16
  ### Breaking change
17
  - Only the self opened streams will be closed (#139)
vendor/maennchen/zipstream-php/src/Option/Method.php CHANGED
@@ -10,9 +10,10 @@ use MyCLabs\Enum\Enum;
10
  *
11
  * @method static STORE(): Method
12
  * @method static DEFLATE(): Method
 
13
  */
14
  class Method extends Enum
15
  {
16
  const STORE = 0x00;
17
  const DEFLATE = 0x08;
18
- }
10
  *
11
  * @method static STORE(): Method
12
  * @method static DEFLATE(): Method
13
+ * @psalm-immutable
14
  */
15
  class Method extends Enum
16
  {
17
  const STORE = 0x00;
18
  const DEFLATE = 0x08;
19
+ }
vendor/maennchen/zipstream-php/src/Option/Version.php CHANGED
@@ -12,10 +12,11 @@ use MyCLabs\Enum\Enum;
12
  * @method static STORE(): Version
13
  * @method static DEFLATE(): Version
14
  * @method static ZIP64(): Version
 
15
  */
16
  class Version extends Enum
17
  {
18
  const STORE = 0x000A; // 1.00
19
  const DEFLATE = 0x0014; // 2.00
20
  const ZIP64 = 0x002D; // 4.50
21
- }
12
  * @method static STORE(): Version
13
  * @method static DEFLATE(): Version
14
  * @method static ZIP64(): Version
15
+ * @psalm-immutable
16
  */
17
  class Version extends Enum
18
  {
19
  const STORE = 0x000A; // 1.00
20
  const DEFLATE = 0x0014; // 2.00
21
  const ZIP64 = 0x002D; // 4.50
22
+ }
vendor/myclabs/php-enum/README.md CHANGED
@@ -1,9 +1,9 @@
1
  # PHP Enum implementation inspired from SplEnum
2
 
3
- [![Build Status](https://travis-ci.org/myclabs/php-enum.png?branch=master)](https://travis-ci.org/myclabs/php-enum)
4
  [![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum)
5
  [![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum)
6
- [![psalm](https://shepherd.dev/github/myclabs/php-enum/coverage.svg)](https://shepherd.dev/github/myclabs/php-enum)
7
 
8
  Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme).
9
 
@@ -13,7 +13,8 @@ First, and mainly, `SplEnum` is not integrated to PHP, you have to install the e
13
 
14
  Using an enum instead of class constants provides the following advantages:
15
 
16
- - You can type-hint: `function setAction(Action $action) {`
 
17
  - You can enrich the enum with methods (e.g. `format`, `parse`, …)
18
  - You can extend the enum to add new values (make your enum `final` to prevent it)
19
  - You can get a list of all the possible values (see below)
@@ -34,7 +35,7 @@ use MyCLabs\Enum\Enum;
34
  /**
35
  * Action enum
36
  */
37
- class Action extends Enum
38
  {
39
  private const VIEW = 'view';
40
  private const EDIT = 'edit';
@@ -49,12 +50,14 @@ $action = Action::VIEW();
49
  // or with a dynamic key:
50
  $action = Action::$key();
51
  // or with a dynamic value:
 
 
52
  $action = new Action($value);
53
  ```
54
 
55
  As you can see, static methods are automatically implemented to provide quick access to an enum value.
56
 
57
- One advantage over using class constants is to be able to type-hint enum values:
58
 
59
  ```php
60
  function setAction(Action $action) {
@@ -72,17 +75,19 @@ function setAction(Action $action) {
72
 
73
  Static methods:
74
 
 
75
  - `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
76
  - `keys()` Returns the names (keys) of all constants in the Enum class
77
  - `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
78
  - `isValid()` Check if tested value is valid on enum set
79
  - `isValidKey()` Check if tested key is valid on enum set
 
80
  - `search()` Return key for searched value
81
 
82
  ### Static methods
83
 
84
  ```php
85
- class Action extends Enum
86
  {
87
  private const VIEW = 'view';
88
  private const EDIT = 'edit';
@@ -98,7 +103,7 @@ Static method helpers are implemented using [`__callStatic()`](http://www.php.ne
98
  If you care about IDE autocompletion, you can either implement the static methods yourself:
99
 
100
  ```php
101
- class Action extends Enum
102
  {
103
  private const VIEW = 'view';
104
 
@@ -118,15 +123,72 @@ or you can use phpdoc (this is supported in PhpStorm for example):
118
  * @method static Action VIEW()
119
  * @method static Action EDIT()
120
  */
121
- class Action extends Enum
122
  {
123
  private const VIEW = 'view';
124
  private const EDIT = 'edit';
125
  }
126
  ```
127
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  ## Related projects
129
 
 
130
  - [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
131
  - [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
132
  - [PHPStan integration](https://github.com/timeweb/phpstan-enum)
 
 
 
 
 
 
 
 
 
1
  # PHP Enum implementation inspired from SplEnum
2
 
3
+ [![GitHub Actions][GA Image]][GA Link]
4
  [![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum)
5
  [![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum)
6
+ [![Psalm Shepherd][Shepherd Image]][Shepherd Link]
7
 
8
  Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme).
9
 
13
 
14
  Using an enum instead of class constants provides the following advantages:
15
 
16
+ - You can use an enum as a parameter type: `function setAction(Action $action) {`
17
+ - You can use an enum as a return type: `function getAction() : Action {`
18
  - You can enrich the enum with methods (e.g. `format`, `parse`, …)
19
  - You can extend the enum to add new values (make your enum `final` to prevent it)
20
  - You can get a list of all the possible values (see below)
35
  /**
36
  * Action enum
37
  */
38
+ final class Action extends Enum
39
  {
40
  private const VIEW = 'view';
41
  private const EDIT = 'edit';
50
  // or with a dynamic key:
51
  $action = Action::$key();
52
  // or with a dynamic value:
53
+ $action = Action::from($value);
54
+ // or
55
  $action = new Action($value);
56
  ```
57
 
58
  As you can see, static methods are automatically implemented to provide quick access to an enum value.
59
 
60
+ One advantage over using class constants is to be able to use an enum as a parameter type:
61
 
62
  ```php
63
  function setAction(Action $action) {
75
 
76
  Static methods:
77
 
78
+ - `from()` Creates an Enum instance, checking that the value exist in the enum
79
  - `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
80
  - `keys()` Returns the names (keys) of all constants in the Enum class
81
  - `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
82
  - `isValid()` Check if tested value is valid on enum set
83
  - `isValidKey()` Check if tested key is valid on enum set
84
+ - `assertValidValue()` Assert the value is valid on enum set, throwing exception otherwise
85
  - `search()` Return key for searched value
86
 
87
  ### Static methods
88
 
89
  ```php
90
+ final class Action extends Enum
91
  {
92
  private const VIEW = 'view';
93
  private const EDIT = 'edit';
103
  If you care about IDE autocompletion, you can either implement the static methods yourself:
104
 
105
  ```php
106
+ final class Action extends Enum
107
  {
108
  private const VIEW = 'view';
109
 
123
  * @method static Action VIEW()
124
  * @method static Action EDIT()
125
  */
126
+ final class Action extends Enum
127
  {
128
  private const VIEW = 'view';
129
  private const EDIT = 'edit';
130
  }
131
  ```
132
 
133
+ ## Native enums and migration
134
+ Native enum arrived to PHP in version 8.1: https://www.php.net/enumerations
135
+ If your project is running PHP 8.1+ or your library has it as a minimum requirement you should use it instead of this library.
136
+
137
+ When migrating from `myclabs/php-enum`, the effort should be small if the usage was in the recommended way:
138
+ - private constants
139
+ - final classes
140
+ - no method overridden
141
+
142
+ Changes for migration:
143
+ - Class definition should be changed from
144
+ ```php
145
+ /**
146
+ * @method static Action VIEW()
147
+ * @method static Action EDIT()
148
+ */
149
+ final class Action extends Enum
150
+ {
151
+ private const VIEW = 'view';
152
+ private const EDIT = 'edit';
153
+ }
154
+ ```
155
+ to
156
+ ```php
157
+ enum Action: string
158
+ {
159
+ case VIEW = 'view';
160
+ case EDIT = 'edit';
161
+ }
162
+ ```
163
+ All places where the class was used as a type will continue to work.
164
+
165
+ Usages and the change needed:
166
+
167
+ | Operation | myclabs/php-enum | native enum |
168
+ |----------------------------------------------------------------|----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
169
+ | Obtain an instance will change from | `$enumCase = Action::VIEW()` | `$enumCase = Action::VIEW` |
170
+ | Create an enum from a backed value | `$enumCase = new Action('view')` | `$enumCase = Action::from('view')` |
171
+ | Get the backed value of the enum instance | `$enumCase->getValue()` | `$enumCase->value` |
172
+ | Compare two enum instances | `$enumCase1 == $enumCase2` <br/> or <br/> `$enumCase1->equals($enumCase2)` | `$enumCase1 === $enumCase2` |
173
+ | Get the key/name of the enum instance | `$enumCase->getKey()` | `$enumCase->name` |
174
+ | Get a list of all the possible instances of the enum | `Action::values()` | `Action::cases()` |
175
+ | Get a map of possible instances of the enum mapped by name | `Action::values()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases())` <br/> or <br/> `(new ReflectionEnum(Action::class))->getConstants()` |
176
+ | Get a list of all possible names of the enum | `Action::keys()` | `array_map(fn($case) => $case->name, Action::cases())` |
177
+ | Get a list of all possible backed values of the enum | `Action::toArray()` | `array_map(fn($case) => $case->value, Action::cases())` |
178
+ | Get a map of possible backed values of the enum mapped by name | `Action::toArray()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases()))` <br/> or <br/> `array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants()))` |
179
+
180
  ## Related projects
181
 
182
+ - [PHP 8.1+ native enum](https://www.php.net/enumerations)
183
  - [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
184
  - [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
185
  - [PHPStan integration](https://github.com/timeweb/phpstan-enum)
186
+
187
+
188
+ [GA Image]: https://github.com/myclabs/php-enum/workflows/CI/badge.svg
189
+
190
+ [GA Link]: https://github.com/myclabs/php-enum/actions?query=workflow%3A%22CI%22+branch%3Amaster
191
+
192
+ [Shepherd Image]: https://shepherd.dev/github/myclabs/php-enum/coverage.svg
193
+
194
+ [Shepherd Link]: https://shepherd.dev/github/myclabs/php-enum
vendor/myclabs/php-enum/composer.json CHANGED
@@ -14,7 +14,10 @@
14
  "autoload": {
15
  "psr-4": {
16
  "MyCLabs\\Enum\\": "src/"
17
- }
 
 
 
18
  },
19
  "autoload-dev": {
20
  "psr-4": {
@@ -22,12 +25,12 @@
22
  }
23
  },
24
  "require": {
25
- "php": ">=7.1",
26
  "ext-json": "*"
27
  },
28
  "require-dev": {
29
- "phpunit/phpunit": "^7",
30
  "squizlabs/php_codesniffer": "1.*",
31
- "vimeo/psalm": "^3.8"
32
  }
33
  }
14
  "autoload": {
15
  "psr-4": {
16
  "MyCLabs\\Enum\\": "src/"
17
+ },
18
+ "classmap": [
19
+ "stubs/Stringable.php"
20
+ ]
21
  },
22
  "autoload-dev": {
23
  "psr-4": {
25
  }
26
  },
27
  "require": {
28
+ "php": "^7.3 || ^8.0",
29
  "ext-json": "*"
30
  },
31
  "require-dev": {
32
+ "phpunit/phpunit": "^9.5",
33
  "squizlabs/php_codesniffer": "1.*",
34
+ "vimeo/psalm": "^4.6.2"
35
  }
36
  }
vendor/myclabs/php-enum/psalm.xml DELETED
@@ -1,20 +0,0 @@
1
- <?xml version="1.0"?>
2
- <psalm
3
- totallyTyped="true"
4
- resolveFromConfigFile="true"
5
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6
- xmlns="https://getpsalm.org/schema/config"
7
- xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
8
- >
9
- <projectFiles>
10
- <directory name="src" />
11
- <ignoreFiles>
12
- <directory name="vendor" />
13
- <directory name="src/PHPUnit" />
14
- </ignoreFiles>
15
- </projectFiles>
16
-
17
- <issueHandlers>
18
- <MixedAssignment errorLevel="info" />
19
- </issueHandlers>
20
- </psalm>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/myclabs/php-enum/src/Enum.php CHANGED
@@ -17,8 +17,9 @@ namespace MyCLabs\Enum;
17
  *
18
  * @psalm-template T
19
  * @psalm-immutable
 
20
  */
21
- abstract class Enum implements \JsonSerializable
22
  {
23
  /**
24
  * Enum value
@@ -28,6 +29,13 @@ abstract class Enum implements \JsonSerializable
28
  */
29
  protected $value;
30
 
 
 
 
 
 
 
 
31
  /**
32
  * Store existing constants in a static cache per object.
33
  *
@@ -37,13 +45,21 @@ abstract class Enum implements \JsonSerializable
37
  */
38
  protected static $cache = [];
39
 
 
 
 
 
 
 
 
 
40
  /**
41
  * Creates a new value of some type
42
  *
43
  * @psalm-pure
44
  * @param mixed $value
45
  *
46
- * @psalm-param static<T>|T $value
47
  * @throws \UnexpectedValueException if incompatible type is given.
48
  */
49
  public function __construct($value)
@@ -53,15 +69,40 @@ abstract class Enum implements \JsonSerializable
53
  $value = $value->getValue();
54
  }
55
 
56
- if (!$this->isValid($value)) {
57
- /** @psalm-suppress InvalidCast */
58
- throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
59
- }
60
 
61
  /** @psalm-var T */
62
  $this->value = $value;
63
  }
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  /**
66
  * @psalm-pure
67
  * @return mixed
@@ -76,11 +117,11 @@ abstract class Enum implements \JsonSerializable
76
  * Returns the enum key (i.e. the constant name).
77
  *
78
  * @psalm-pure
79
- * @return mixed
80
  */
81
  public function getKey()
82
  {
83
- return static::search($this->value);
84
  }
85
 
86
  /**
@@ -155,7 +196,9 @@ abstract class Enum implements \JsonSerializable
155
  $class = static::class;
156
 
157
  if (!isset(static::$cache[$class])) {
 
158
  $reflection = new \ReflectionClass($class);
 
159
  static::$cache[$class] = $reflection->getConstants();
160
  }
161
 
@@ -168,6 +211,7 @@ abstract class Enum implements \JsonSerializable
168
  * @param $value
169
  * @psalm-param mixed $value
170
  * @psalm-pure
 
171
  * @return bool
172
  */
173
  public static function isValid($value)
@@ -175,6 +219,35 @@ abstract class Enum implements \JsonSerializable
175
  return \in_array($value, static::toArray(), true);
176
  }
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  /**
179
  * Check if is valid enum key
180
  *
@@ -193,11 +266,11 @@ abstract class Enum implements \JsonSerializable
193
  /**
194
  * Return key for value
195
  *
196
- * @param $value
197
  *
198
  * @psalm-param mixed $value
199
  * @psalm-pure
200
- * @return mixed
201
  */
202
  public static function search($value)
203
  {
@@ -211,17 +284,22 @@ abstract class Enum implements \JsonSerializable
211
  * @param array $arguments
212
  *
213
  * @return static
214
- * @psalm-pure
215
  * @throws \BadMethodCallException
 
 
216
  */
217
  public static function __callStatic($name, $arguments)
218
  {
219
- $array = static::toArray();
220
- if (isset($array[$name]) || \array_key_exists($name, $array)) {
221
- return new static($array[$name]);
 
 
 
 
 
222
  }
223
-
224
- throw new \BadMethodCallException("No static method or enum constant '$name' in class " . static::class);
225
  }
226
 
227
  /**
@@ -232,6 +310,7 @@ abstract class Enum implements \JsonSerializable
232
  * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
233
  * @psalm-pure
234
  */
 
235
  public function jsonSerialize()
236
  {
237
  return $this->getValue();
17
  *
18
  * @psalm-template T
19
  * @psalm-immutable
20
+ * @psalm-consistent-constructor
21
  */
22
+ abstract class Enum implements \JsonSerializable, \Stringable
23
  {
24
  /**
25
  * Enum value
29
  */
30
  protected $value;
31
 
32
+ /**
33
+ * Enum key, the constant name
34
+ *
35
+ * @var string
36
+ */
37
+ private $key;
38
+
39
  /**
40
  * Store existing constants in a static cache per object.
41
  *
45
  */
46
  protected static $cache = [];
47
 
48
+ /**
49
+ * Cache of instances of the Enum class
50
+ *
51
+ * @var array
52
+ * @psalm-var array<class-string, array<string, static>>
53
+ */
54
+ protected static $instances = [];
55
+
56
  /**
57
  * Creates a new value of some type
58
  *
59
  * @psalm-pure
60
  * @param mixed $value
61
  *
62
+ * @psalm-param T $value
63
  * @throws \UnexpectedValueException if incompatible type is given.
64
  */
65
  public function __construct($value)
69
  $value = $value->getValue();
70
  }
71
 
72
+ /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */
73
+ $this->key = static::assertValidValueReturningKey($value);
 
 
74
 
75
  /** @psalm-var T */
76
  $this->value = $value;
77
  }
78
 
79
+ /**
80
+ * This method exists only for the compatibility reason when deserializing a previously serialized version
81
+ * that didn't had the key property
82
+ */
83
+ public function __wakeup()
84
+ {
85
+ /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */
86
+ if ($this->key === null) {
87
+ /**
88
+ * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm
89
+ * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed
90
+ */
91
+ $this->key = static::search($this->value);
92
+ }
93
+ }
94
+
95
+ /**
96
+ * @param mixed $value
97
+ * @return static
98
+ */
99
+ public static function from($value): self
100
+ {
101
+ $key = static::assertValidValueReturningKey($value);
102
+
103
+ return self::__callStatic($key, []);
104
+ }
105
+
106
  /**
107
  * @psalm-pure
108
  * @return mixed
117
  * Returns the enum key (i.e. the constant name).
118
  *
119
  * @psalm-pure
120
+ * @return string
121
  */
122
  public function getKey()
123
  {
124
+ return $this->key;
125
  }
126
 
127
  /**
196
  $class = static::class;
197
 
198
  if (!isset(static::$cache[$class])) {
199
+ /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
200
  $reflection = new \ReflectionClass($class);
201
+ /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
202
  static::$cache[$class] = $reflection->getConstants();
203
  }
204
 
211
  * @param $value
212
  * @psalm-param mixed $value
213
  * @psalm-pure
214
+ * @psalm-assert-if-true T $value
215
  * @return bool
216
  */
217
  public static function isValid($value)
219
  return \in_array($value, static::toArray(), true);
220
  }
221
 
222
+ /**
223
+ * Asserts valid enum value
224
+ *
225
+ * @psalm-pure
226
+ * @psalm-assert T $value
227
+ * @param mixed $value
228
+ */
229
+ public static function assertValidValue($value): void
230
+ {
231
+ self::assertValidValueReturningKey($value);
232
+ }
233
+
234
+ /**
235
+ * Asserts valid enum value
236
+ *
237
+ * @psalm-pure
238
+ * @psalm-assert T $value
239
+ * @param mixed $value
240
+ * @return string
241
+ */
242
+ private static function assertValidValueReturningKey($value): string
243
+ {
244
+ if (false === ($key = static::search($value))) {
245
+ throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
246
+ }
247
+
248
+ return $key;
249
+ }
250
+
251
  /**
252
  * Check if is valid enum key
253
  *
266
  /**
267
  * Return key for value
268
  *
269
+ * @param mixed $value
270
  *
271
  * @psalm-param mixed $value
272
  * @psalm-pure
273
+ * @return string|false
274
  */
275
  public static function search($value)
276
  {
284
  * @param array $arguments
285
  *
286
  * @return static
 
287
  * @throws \BadMethodCallException
288
+ *
289
+ * @psalm-pure
290
  */
291
  public static function __callStatic($name, $arguments)
292
  {
293
+ $class = static::class;
294
+ if (!isset(self::$instances[$class][$name])) {
295
+ $array = static::toArray();
296
+ if (!isset($array[$name]) && !\array_key_exists($name, $array)) {
297
+ $message = "No static method or enum constant '$name' in class " . static::class;
298
+ throw new \BadMethodCallException($message);
299
+ }
300
+ return self::$instances[$class][$name] = new static($array[$name]);
301
  }
302
+ return clone self::$instances[$class][$name];
 
303
  }
304
 
305
  /**
310
  * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
311
  * @psalm-pure
312
  */
313
+ #[\ReturnTypeWillChange]
314
  public function jsonSerialize()
315
  {
316
  return $this->getValue();
vendor/myclabs/php-enum/stubs/Stringable.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (\PHP_VERSION_ID < 80000 && !interface_exists('Stringable')) {
4
+ interface Stringable
5
+ {
6
+ /**
7
+ * @return string
8
+ */
9
+ public function __toString();
10
+ }
11
+ }
vendor/symfony/polyfill-mbstring/Mbstring.php CHANGED
@@ -67,19 +67,20 @@ namespace Symfony\Polyfill\Mbstring;
67
  */
68
  final class Mbstring
69
  {
70
- const MB_CASE_FOLD = PHP_INT_MAX;
71
 
72
- private static $encodingList = array('ASCII', 'UTF-8');
 
 
 
 
 
73
  private static $language = 'neutral';
74
  private static $internalEncoding = 'UTF-8';
75
- private static $caseFold = array(
76
- array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
77
- array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'),
78
- );
79
 
80
  public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
81
  {
82
- if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
83
  $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
84
  } else {
85
  $fromEncoding = self::getEncoding($fromEncoding);
@@ -101,27 +102,25 @@ final class Mbstring
101
  $fromEncoding = 'Windows-1252';
102
  }
103
  if ('UTF-8' !== $fromEncoding) {
104
- $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
105
  }
106
 
107
- return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
108
  }
109
 
110
  if ('HTML-ENTITIES' === $fromEncoding) {
111
- $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
112
  $fromEncoding = 'UTF-8';
113
  }
114
 
115
- return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
116
  }
117
 
118
- public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
119
  {
120
- $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
121
-
122
  $ok = true;
123
  array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
124
- if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
125
  $ok = false;
126
  }
127
  });
@@ -131,28 +130,28 @@ final class Mbstring
131
 
132
  public static function mb_decode_mimeheader($s)
133
  {
134
- return iconv_mime_decode($s, 2, self::$internalEncoding);
135
  }
136
 
137
  public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
138
  {
139
- trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
140
  }
141
 
142
  public static function mb_decode_numericentity($s, $convmap, $encoding = null)
143
  {
144
- if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
145
- trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
146
 
147
  return null;
148
  }
149
 
150
- if (!\is_array($convmap) || !$convmap) {
151
  return false;
152
  }
153
 
154
- if (null !== $encoding && !\is_scalar($encoding)) {
155
- trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
156
 
157
  return ''; // Instead of null (cf. mb_encode_numericentity).
158
  }
@@ -167,10 +166,10 @@ final class Mbstring
167
  if ('UTF-8' === $encoding) {
168
  $encoding = null;
169
  if (!preg_match('//u', $s)) {
170
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
171
  }
172
  } else {
173
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
174
  }
175
 
176
  $cnt = floor(\count($convmap) / 4) * 4;
@@ -185,7 +184,7 @@ final class Mbstring
185
  $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
186
  for ($i = 0; $i < $cnt; $i += 4) {
187
  if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
188
- return Mbstring::mb_chr($c - $convmap[$i + 2]);
189
  }
190
  }
191
 
@@ -196,29 +195,29 @@ final class Mbstring
196
  return $s;
197
  }
198
 
199
- return iconv('UTF-8', $encoding.'//IGNORE', $s);
200
  }
201
 
202
  public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
203
  {
204
- if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
205
- trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
206
 
207
  return null;
208
  }
209
 
210
- if (!\is_array($convmap) || !$convmap) {
211
  return false;
212
  }
213
 
214
- if (null !== $encoding && !\is_scalar($encoding)) {
215
- trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
216
 
217
  return null; // Instead of '' (cf. mb_decode_numericentity).
218
  }
219
 
220
- if (null !== $is_hex && !\is_scalar($is_hex)) {
221
- trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
222
 
223
  return null;
224
  }
@@ -233,13 +232,13 @@ final class Mbstring
233
  if ('UTF-8' === $encoding) {
234
  $encoding = null;
235
  if (!preg_match('//u', $s)) {
236
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
237
  }
238
  } else {
239
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
240
  }
241
 
242
- static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
243
 
244
  $cnt = floor(\count($convmap) / 4) * 4;
245
  $i = 0;
@@ -266,7 +265,7 @@ final class Mbstring
266
  return $result;
267
  }
268
 
269
- return iconv('UTF-8', $encoding.'//IGNORE', $result);
270
  }
271
 
272
  public static function mb_convert_case($s, $mode, $encoding = null)
@@ -281,20 +280,20 @@ final class Mbstring
281
  if ('UTF-8' === $encoding) {
282
  $encoding = null;
283
  if (!preg_match('//u', $s)) {
284
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
285
  }
286
  } else {
287
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
288
  }
289
 
290
- if (MB_CASE_TITLE == $mode) {
291
  static $titleRegexp = null;
292
  if (null === $titleRegexp) {
293
  $titleRegexp = self::getData('titleCaseRegexp');
294
  }
295
- $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
296
  } else {
297
- if (MB_CASE_UPPER == $mode) {
298
  static $upper = null;
299
  if (null === $upper) {
300
  $upper = self::getData('upperCase');
@@ -302,7 +301,7 @@ final class Mbstring
302
  $map = $upper;
303
  } else {
304
  if (self::MB_CASE_FOLD === $mode) {
305
- $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
306
  }
307
 
308
  static $lower = null;
@@ -312,7 +311,7 @@ final class Mbstring
312
  $map = $lower;
313
  }
314
 
315
- static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
316
 
317
  $i = 0;
318
  $len = \strlen($s);
@@ -344,7 +343,7 @@ final class Mbstring
344
  return $s;
345
  }
346
 
347
- return iconv('UTF-8', $encoding.'//IGNORE', $s);
348
  }
349
 
350
  public static function mb_internal_encoding($encoding = null)
@@ -353,15 +352,19 @@ final class Mbstring
353
  return self::$internalEncoding;
354
  }
355
 
356
- $encoding = self::getEncoding($encoding);
357
 
358
- if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
359
- self::$internalEncoding = $encoding;
360
 
361
  return true;
362
  }
363
 
364
- return false;
 
 
 
 
365
  }
366
 
367
  public static function mb_language($lang = null)
@@ -370,20 +373,24 @@ final class Mbstring
370
  return self::$language;
371
  }
372
 
373
- switch ($lang = strtolower($lang)) {
374
  case 'uni':
375
  case 'neutral':
376
- self::$language = $lang;
377
 
378
  return true;
379
  }
380
 
381
- return false;
 
 
 
 
382
  }
383
 
384
  public static function mb_list_encodings()
385
  {
386
- return array('UTF-8');
387
  }
388
 
389
  public static function mb_encoding_aliases($encoding)
@@ -391,7 +398,7 @@ final class Mbstring
391
  switch (strtoupper($encoding)) {
392
  case 'UTF8':
393
  case 'UTF-8':
394
- return array('utf8');
395
  }
396
 
397
  return false;
@@ -406,7 +413,7 @@ final class Mbstring
406
  $encoding = self::$internalEncoding;
407
  }
408
 
409
- return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
410
  }
411
 
412
  public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
@@ -481,7 +488,7 @@ final class Mbstring
481
  return \strlen($s);
482
  }
483
 
484
- return @iconv_strlen($s, $encoding);
485
  }
486
 
487
  public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
@@ -493,12 +500,16 @@ final class Mbstring
493
 
494
  $needle = (string) $needle;
495
  if ('' === $needle) {
496
- trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
 
497
 
498
- return false;
 
 
 
499
  }
500
 
501
- return iconv_strpos($haystack, $needle, $offset, $encoding);
502
  }
503
 
504
  public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
@@ -521,23 +532,28 @@ final class Mbstring
521
  }
522
  }
523
 
524
- $pos = iconv_strrpos($haystack, $needle, $encoding);
 
 
525
 
526
  return false !== $pos ? $offset + $pos : false;
527
  }
528
 
529
  public static function mb_str_split($string, $split_length = 1, $encoding = null)
530
  {
531
- if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
532
- trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
533
 
534
  return null;
535
  }
536
 
537
  if (1 > $split_length = (int) $split_length) {
538
- trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
 
 
 
539
 
540
- return false;
541
  }
542
 
543
  if (null === $encoding) {
@@ -552,10 +568,10 @@ final class Mbstring
552
  }
553
  $rx .= '.{'.$split_length.'})/us';
554
 
555
- return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
556
  }
557
 
558
- $result = array();
559
  $length = mb_strlen($string, $encoding);
560
 
561
  for ($i = 0; $i < $length; $i += $split_length) {
@@ -567,21 +583,30 @@ final class Mbstring
567
 
568
  public static function mb_strtolower($s, $encoding = null)
569
  {
570
- return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
571
  }
572
 
573
  public static function mb_strtoupper($s, $encoding = null)
574
  {
575
- return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
576
  }
577
 
578
  public static function mb_substitute_character($c = null)
579
  {
 
 
 
580
  if (0 === strcasecmp($c, 'none')) {
581
  return true;
582
  }
 
 
 
 
 
 
583
 
584
- return null !== $c ? false : 'none';
585
  }
586
 
587
  public static function mb_substr($s, $start, $length = null, $encoding = null)
@@ -592,7 +617,7 @@ final class Mbstring
592
  }
593
 
594
  if ($start < 0) {
595
- $start = iconv_strlen($s, $encoding) + $start;
596
  if ($start < 0) {
597
  $start = 0;
598
  }
@@ -601,13 +626,13 @@ final class Mbstring
601
  if (null === $length) {
602
  $length = 2147483647;
603
  } elseif ($length < 0) {
604
- $length = iconv_strlen($s, $encoding) + $length - $start;
605
  if ($length < 0) {
606
  return '';
607
  }
608
  }
609
 
610
- return (string) iconv_substr($s, $start, $length, $encoding);
611
  }
612
 
613
  public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
@@ -629,10 +654,11 @@ final class Mbstring
629
  {
630
  $encoding = self::getEncoding($encoding);
631
  if ('CP850' === $encoding || 'ASCII' === $encoding) {
632
- return strrchr($haystack, $needle, $part);
 
 
 
633
  }
634
- $needle = self::mb_substr($needle, 0, 1, $encoding);
635
- $pos = iconv_strrpos($haystack, $needle, $encoding);
636
 
637
  return self::getSubpart($pos, $part, $haystack, $encoding);
638
  }
@@ -668,7 +694,7 @@ final class Mbstring
668
 
669
  public static function mb_get_info($type = 'all')
670
  {
671
- $info = array(
672
  'internal_encoding' => self::$internalEncoding,
673
  'http_output' => 'pass',
674
  'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
@@ -683,7 +709,7 @@ final class Mbstring
683
  'detect_order' => self::$encodingList,
684
  'substitute_character' => 'none',
685
  'strict_detection' => 'Off',
686
- );
687
 
688
  if ('all' === $type) {
689
  return $info;
@@ -710,12 +736,12 @@ final class Mbstring
710
  $encoding = self::getEncoding($encoding);
711
 
712
  if ('UTF-8' !== $encoding) {
713
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
714
  }
715
 
716
  $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
717
 
718
- return ($wide << 1) + iconv_strlen($s, 'UTF-8');
719
  }
720
 
721
  public static function mb_substr_count($haystack, $needle, $encoding = null)
@@ -787,7 +813,7 @@ final class Mbstring
787
  {
788
  $i = 1;
789
  $entities = '';
790
- $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
791
 
792
  while (isset($m[$i])) {
793
  if (0x80 > $m[$i]) {
@@ -810,7 +836,7 @@ final class Mbstring
810
 
811
  private static function title_case(array $s)
812
  {
813
- return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
814
  }
815
 
816
  private static function getData($file)
67
  */
68
  final class Mbstring
69
  {
70
+ public const MB_CASE_FOLD = \PHP_INT_MAX;
71
 
72
+ private const CASE_FOLD = [
73
+ ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
74
+ ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'],
75
+ ];
76
+
77
+ private static $encodingList = ['ASCII', 'UTF-8'];
78
  private static $language = 'neutral';
79
  private static $internalEncoding = 'UTF-8';
 
 
 
 
80
 
81
  public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
82
  {
83
+ if (\is_array($fromEncoding) || ($fromEncoding !== null && false !== strpos($fromEncoding, ','))) {
84
  $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
85
  } else {
86
  $fromEncoding = self::getEncoding($fromEncoding);
102
  $fromEncoding = 'Windows-1252';
103
  }
104
  if ('UTF-8' !== $fromEncoding) {
105
+ $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s);
106
  }
107
 
108
+ return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
109
  }
110
 
111
  if ('HTML-ENTITIES' === $fromEncoding) {
112
+ $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8');
113
  $fromEncoding = 'UTF-8';
114
  }
115
 
116
+ return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
117
  }
118
 
119
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
120
  {
 
 
121
  $ok = true;
122
  array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
123
+ if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
124
  $ok = false;
125
  }
126
  });
130
 
131
  public static function mb_decode_mimeheader($s)
132
  {
133
+ return \iconv_mime_decode($s, 2, self::$internalEncoding);
134
  }
135
 
136
  public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
137
  {
138
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING);
139
  }
140
 
141
  public static function mb_decode_numericentity($s, $convmap, $encoding = null)
142
  {
143
+ if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
144
+ trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
145
 
146
  return null;
147
  }
148
 
149
+ if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
150
  return false;
151
  }
152
 
153
+ if (null !== $encoding && !is_scalar($encoding)) {
154
+ trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
155
 
156
  return ''; // Instead of null (cf. mb_encode_numericentity).
157
  }
166
  if ('UTF-8' === $encoding) {
167
  $encoding = null;
168
  if (!preg_match('//u', $s)) {
169
+ $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
170
  }
171
  } else {
172
+ $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
173
  }
174
 
175
  $cnt = floor(\count($convmap) / 4) * 4;
184
  $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
185
  for ($i = 0; $i < $cnt; $i += 4) {
186
  if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
187
+ return self::mb_chr($c - $convmap[$i + 2]);
188
  }
189
  }
190
 
195
  return $s;
196
  }
197
 
198
+ return \iconv('UTF-8', $encoding.'//IGNORE', $s);
199
  }
200
 
201
  public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
202
  {
203
+ if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
204
+ trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
205
 
206
  return null;
207
  }
208
 
209
+ if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
210
  return false;
211
  }
212
 
213
+ if (null !== $encoding && !is_scalar($encoding)) {
214
+ trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
215
 
216
  return null; // Instead of '' (cf. mb_decode_numericentity).
217
  }
218
 
219
+ if (null !== $is_hex && !is_scalar($is_hex)) {
220
+ trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);
221
 
222
  return null;
223
  }
232
  if ('UTF-8' === $encoding) {
233
  $encoding = null;
234
  if (!preg_match('//u', $s)) {
235
+ $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
236
  }
237
  } else {
238
+ $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
239
  }
240
 
241
+ static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
242
 
243
  $cnt = floor(\count($convmap) / 4) * 4;
244
  $i = 0;
265
  return $result;
266
  }
267
 
268
+ return \iconv('UTF-8', $encoding.'//IGNORE', $result);
269
  }
270
 
271
  public static function mb_convert_case($s, $mode, $encoding = null)
280
  if ('UTF-8' === $encoding) {
281
  $encoding = null;
282
  if (!preg_match('//u', $s)) {
283
+ $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
284
  }
285
  } else {
286
+ $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
287
  }
288
 
289
+ if (\MB_CASE_TITLE == $mode) {
290
  static $titleRegexp = null;
291
  if (null === $titleRegexp) {
292
  $titleRegexp = self::getData('titleCaseRegexp');
293
  }
294
+ $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);
295
  } else {
296
+ if (\MB_CASE_UPPER == $mode) {
297
  static $upper = null;
298
  if (null === $upper) {
299
  $upper = self::getData('upperCase');
301
  $map = $upper;
302
  } else {
303
  if (self::MB_CASE_FOLD === $mode) {
304
+ $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s);
305
  }
306
 
307
  static $lower = null;
311
  $map = $lower;
312
  }
313
 
314
+ static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
315
 
316
  $i = 0;
317
  $len = \strlen($s);
343
  return $s;
344
  }
345
 
346
+ return \iconv('UTF-8', $encoding.'//IGNORE', $s);
347
  }
348
 
349
  public static function mb_internal_encoding($encoding = null)
352
  return self::$internalEncoding;
353
  }
354
 
355
+ $normalizedEncoding = self::getEncoding($encoding);
356
 
357
+ if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
358
+ self::$internalEncoding = $normalizedEncoding;
359
 
360
  return true;
361
  }
362
 
363
+ if (80000 > \PHP_VERSION_ID) {
364
+ return false;
365
+ }
366
+
367
+ throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding));
368
  }
369
 
370
  public static function mb_language($lang = null)
373
  return self::$language;
374
  }
375
 
376
+ switch ($normalizedLang = strtolower($lang)) {
377
  case 'uni':
378
  case 'neutral':
379
+ self::$language = $normalizedLang;
380
 
381
  return true;
382
  }
383
 
384
+ if (80000 > \PHP_VERSION_ID) {
385
+ return false;
386
+ }
387
+
388
+ throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang));
389
  }
390
 
391
  public static function mb_list_encodings()
392
  {
393
+ return ['UTF-8'];
394
  }
395
 
396
  public static function mb_encoding_aliases($encoding)
398
  switch (strtoupper($encoding)) {
399
  case 'UTF8':
400
  case 'UTF-8':
401
+ return ['utf8'];
402
  }
403
 
404
  return false;
413
  $encoding = self::$internalEncoding;
414
  }
415
 
416
+ return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var);
417
  }
418
 
419
  public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
488
  return \strlen($s);
489
  }
490
 
491
+ return @\iconv_strlen($s, $encoding);
492
  }
493
 
494
  public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
500
 
501
  $needle = (string) $needle;
502
  if ('' === $needle) {
503
+ if (80000 > \PHP_VERSION_ID) {
504
+ trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING);
505
 
506
+ return false;
507
+ }
508
+
509
+ return 0;
510
  }
511
 
512
+ return \iconv_strpos($haystack, $needle, $offset, $encoding);
513
  }
514
 
515
  public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
532
  }
533
  }
534
 
535
+ $pos = '' !== $needle || 80000 > \PHP_VERSION_ID
536
+ ? \iconv_strrpos($haystack, $needle, $encoding)
537
+ : self::mb_strlen($haystack, $encoding);
538
 
539
  return false !== $pos ? $offset + $pos : false;
540
  }
541
 
542
  public static function mb_str_split($string, $split_length = 1, $encoding = null)
543
  {
544
+ if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
545
+ trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);
546
 
547
  return null;
548
  }
549
 
550
  if (1 > $split_length = (int) $split_length) {
551
+ if (80000 > \PHP_VERSION_ID) {
552
+ trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);
553
+ return false;
554
+ }
555
 
556
+ throw new \ValueError('Argument #2 ($length) must be greater than 0');
557
  }
558
 
559
  if (null === $encoding) {
568
  }
569
  $rx .= '.{'.$split_length.'})/us';
570
 
571
+ return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
572
  }
573
 
574
+ $result = [];
575
  $length = mb_strlen($string, $encoding);
576
 
577
  for ($i = 0; $i < $length; $i += $split_length) {
583
 
584
  public static function mb_strtolower($s, $encoding = null)
585
  {
586
+ return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding);
587
  }
588
 
589
  public static function mb_strtoupper($s, $encoding = null)
590
  {
591
+ return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding);
592
  }
593
 
594
  public static function mb_substitute_character($c = null)
595
  {
596
+ if (null === $c) {
597
+ return 'none';
598
+ }
599
  if (0 === strcasecmp($c, 'none')) {
600
  return true;
601
  }
602
+ if (80000 > \PHP_VERSION_ID) {
603
+ return false;
604
+ }
605
+ if (\is_int($c) || 'long' === $c || 'entity' === $c) {
606
+ return false;
607
+ }
608
 
609
+ throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint');
610
  }
611
 
612
  public static function mb_substr($s, $start, $length = null, $encoding = null)
617
  }
618
 
619
  if ($start < 0) {
620
+ $start = \iconv_strlen($s, $encoding) + $start;
621
  if ($start < 0) {
622
  $start = 0;
623
  }
626
  if (null === $length) {
627
  $length = 2147483647;
628
  } elseif ($length < 0) {
629
+ $length = \iconv_strlen($s, $encoding) + $length - $start;
630
  if ($length < 0) {
631
  return '';
632
  }
633
  }
634
 
635
+ return (string) \iconv_substr($s, $start, $length, $encoding);
636
  }
637
 
638
  public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
654
  {
655
  $encoding = self::getEncoding($encoding);
656
  if ('CP850' === $encoding || 'ASCII' === $encoding) {
657
+ $pos = strrpos($haystack, $needle);
658
+ } else {
659
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
660
+ $pos = \iconv_strrpos($haystack, $needle, $encoding);
661
  }
 
 
662
 
663
  return self::getSubpart($pos, $part, $haystack, $encoding);
664
  }
694
 
695
  public static function mb_get_info($type = 'all')
696
  {
697
+ $info = [
698
  'internal_encoding' => self::$internalEncoding,
699
  'http_output' => 'pass',
700
  'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
709
  'detect_order' => self::$encodingList,
710
  'substitute_character' => 'none',
711
  'strict_detection' => 'Off',
712
+ ];
713
 
714
  if ('all' === $type) {
715
  return $info;
736
  $encoding = self::getEncoding($encoding);
737
 
738
  if ('UTF-8' !== $encoding) {
739
+ $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
740
  }
741
 
742
  $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
743
 
744
+ return ($wide << 1) + \iconv_strlen($s, 'UTF-8');
745
  }
746
 
747
  public static function mb_substr_count($haystack, $needle, $encoding = null)
813
  {
814
  $i = 1;
815
  $entities = '';
816
+ $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8'));
817
 
818
  while (isset($m[$i])) {
819
  if (0x80 > $m[$i]) {
836
 
837
  private static function title_case(array $s)
838
  {
839
+ return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8');
840
  }
841
 
842
  private static function getData($file)
vendor/symfony/polyfill-mbstring/README.md CHANGED
@@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the
5
  [Mbstring](https://php.net/mbstring) extension.
6
 
7
  More information can be found in the
8
- [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
9
 
10
  License
11
  =======
5
  [Mbstring](https://php.net/mbstring) extension.
6
 
7
  More information can be found in the
8
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
9
 
10
  License
11
  =======
vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- return array(
4
  'A' => 'a',
5
  'B' => 'b',
6
  'C' => 'c',
@@ -81,7 +81,7 @@ return array(
81
  'Ī' => 'ī',
82
  'Ĭ' => 'ĭ',
83
  'Į' => 'į',
84
- 'İ' => 'i',
85
  'IJ' => 'ij',
86
  'Ĵ' => 'ĵ',
87
  'Ķ' => 'ķ',
@@ -510,6 +510,138 @@ return array(
510
  'Ⴥ' => 'ⴥ',
511
  'Ⴧ' => 'ⴧ',
512
  'Ⴭ' => 'ⴭ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
513
  'Ḁ' => 'ḁ',
514
  'Ḃ' => 'ḃ',
515
  'Ḅ' => 'ḅ',
@@ -993,8 +1125,24 @@ return array(
993
  'Ɜ' => 'ɜ',
994
  'Ɡ' => 'ɡ',
995
  'Ɬ' => 'ɬ',
 
996
  'Ʞ' => 'ʞ',
997
  'Ʇ' => 'ʇ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
998
  'A' => 'a',
999
  'B' => 'b',
1000
  'C' => 'c',
@@ -1061,6 +1209,93 @@ return array(
1061
  '𐐥' => '𐑍',
1062
  '𐐦' => '𐑎',
1063
  '𐐧' => '𐑏',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064
  '𑢠' => '𑣀',
1065
  '𑢡' => '𑣁',
1066
  '𑢢' => '𑣂',
@@ -1093,4 +1328,70 @@ return array(
1093
  '𑢽' => '𑣝',
1094
  '𑢾' => '𑣞',
1095
  '𑢿' => '𑣟',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1096
  );
1
  <?php
2
 
3
+ return array (
4
  'A' => 'a',
5
  'B' => 'b',
6
  'C' => 'c',
81
  'Ī' => 'ī',
82
  'Ĭ' => 'ĭ',
83
  'Į' => 'į',
84
+ 'İ' => 'i̇',
85
  'IJ' => 'ij',
86
  'Ĵ' => 'ĵ',
87
  'Ķ' => 'ķ',
510
  'Ⴥ' => 'ⴥ',
511
  'Ⴧ' => 'ⴧ',
512
  'Ⴭ' => 'ⴭ',
513
+ 'Ꭰ' => 'ꭰ',
514
+ 'Ꭱ' => 'ꭱ',
515
+ 'Ꭲ' => 'ꭲ',
516
+ 'Ꭳ' => 'ꭳ',
517
+ 'Ꭴ' => 'ꭴ',
518
+ 'Ꭵ' => 'ꭵ',
519
+ 'Ꭶ' => 'ꭶ',
520
+ 'Ꭷ' => 'ꭷ',
521
+ 'Ꭸ' => 'ꭸ',
522
+ 'Ꭹ' => 'ꭹ',
523
+ 'Ꭺ' => 'ꭺ',
524
+ 'Ꭻ' => 'ꭻ',
525
+ 'Ꭼ' => 'ꭼ',
526
+ 'Ꭽ' => 'ꭽ',
527
+ 'Ꭾ' => 'ꭾ',
528
+ 'Ꭿ' => 'ꭿ',
529
+ 'Ꮀ' => 'ꮀ',
530
+ 'Ꮁ' => 'ꮁ',
531
+ 'Ꮂ' => 'ꮂ',
532
+ 'Ꮃ' => 'ꮃ',
533
+ 'Ꮄ' => 'ꮄ',
534
+ 'Ꮅ' => 'ꮅ',
535
+ 'Ꮆ' => 'ꮆ',
536
+ 'Ꮇ' => 'ꮇ',
537
+ 'Ꮈ' => 'ꮈ',
538
+ 'Ꮉ' => 'ꮉ',
539
+ 'Ꮊ' => 'ꮊ',
540
+ 'Ꮋ' => 'ꮋ',
541
+ 'Ꮌ' => 'ꮌ',
542
+ 'Ꮍ' => 'ꮍ',
543
+ 'Ꮎ' => 'ꮎ',
544
+ 'Ꮏ' => 'ꮏ',
545
+ 'Ꮐ' => 'ꮐ',
546
+ 'Ꮑ' => 'ꮑ',
547
+ 'Ꮒ' => 'ꮒ',
548
+ 'Ꮓ' => 'ꮓ',
549
+ 'Ꮔ' => 'ꮔ',
550
+ 'Ꮕ' => 'ꮕ',
551
+ 'Ꮖ' => 'ꮖ',
552
+ 'Ꮗ' => 'ꮗ',
553
+ 'Ꮘ' => 'ꮘ',
554
+ 'Ꮙ' => 'ꮙ',
555
+ 'Ꮚ' => 'ꮚ',
556
+ 'Ꮛ' => 'ꮛ',
557
+ 'Ꮜ' => 'ꮜ',
558
+ 'Ꮝ' => 'ꮝ',
559
+ 'Ꮞ' => 'ꮞ',
560
+ 'Ꮟ' => 'ꮟ',
561
+ 'Ꮠ' => 'ꮠ',
562
+ 'Ꮡ' => 'ꮡ',
563
+ 'Ꮢ' => 'ꮢ',
564
+ 'Ꮣ' => 'ꮣ',
565
+ 'Ꮤ' => 'ꮤ',
566
+ 'Ꮥ' => 'ꮥ',
567
+ 'Ꮦ' => 'ꮦ',
568
+ 'Ꮧ' => 'ꮧ',
569
+ 'Ꮨ' => 'ꮨ',
570
+ 'Ꮩ' => 'ꮩ',
571
+ 'Ꮪ' => 'ꮪ',
572
+ 'Ꮫ' => 'ꮫ',
573
+ 'Ꮬ' => 'ꮬ',
574
+ 'Ꮭ' => 'ꮭ',
575
+ 'Ꮮ' => 'ꮮ',
576
+ 'Ꮯ' => 'ꮯ',
577
+ 'Ꮰ' => 'ꮰ',
578
+ 'Ꮱ' => 'ꮱ',
579
+ 'Ꮲ' => 'ꮲ',
580
+ 'Ꮳ' => 'ꮳ',
581
+ 'Ꮴ' => 'ꮴ',
582
+ 'Ꮵ' => 'ꮵ',
583
+ 'Ꮶ' => 'ꮶ',
584
+ 'Ꮷ' => 'ꮷ',
585
+ 'Ꮸ' => 'ꮸ',
586
+ 'Ꮹ' => 'ꮹ',
587
+ 'Ꮺ' => 'ꮺ',
588
+ 'Ꮻ' => 'ꮻ',
589
+ 'Ꮼ' => 'ꮼ',
590
+ 'Ꮽ' => 'ꮽ',
591
+ 'Ꮾ' => 'ꮾ',
592
+ 'Ꮿ' => 'ꮿ',
593
+ 'Ᏸ' => 'ᏸ',
594
+ 'Ᏹ' => 'ᏹ',
595
+ 'Ᏺ' => 'ᏺ',
596
+ 'Ᏻ' => 'ᏻ',
597
+ 'Ᏼ' => 'ᏼ',
598
+ 'Ᏽ' => 'ᏽ',
599
+ 'Ა' => 'ა',
600
+ 'Ბ' => 'ბ',
601
+ 'Გ' => 'გ',
602
+ 'Დ' => 'დ',
603
+ 'Ე' => 'ე',
604
+ 'Ვ' => 'ვ',
605
+ 'Ზ' => 'ზ',
606
+ 'Თ' => 'თ',
607
+ 'Ი' => 'ი',
608
+ 'Კ' => 'კ',
609
+ 'Ლ' => 'ლ',
610
+ 'Მ' => 'მ',
611
+ 'Ნ' => 'ნ',
612
+ 'Ო' => 'ო',
613
+ 'Პ' => 'პ',
614
+ 'Ჟ' => 'ჟ',
615
+ 'Რ' => 'რ',
616
+ 'Ს' => 'ს',
617
+ 'Ტ' => 'ტ',
618
+ 'Უ' => 'უ',
619
+ 'Ფ' => 'ფ',
620
+ 'Ქ' => 'ქ',
621
+ 'Ღ' => 'ღ',
622
+ 'Ყ' => 'ყ',
623
+ 'Შ' => 'შ',
624
+ 'Ჩ' => 'ჩ',
625
+ 'Ც' => 'ც',
626
+ 'Ძ' => 'ძ',
627
+ 'Წ' => 'წ',
628
+ 'Ჭ' => 'ჭ',
629
+ 'Ხ' => 'ხ',
630
+ 'Ჯ' => 'ჯ',
631
+ 'Ჰ' => 'ჰ',
632
+ 'Ჱ' => 'ჱ',
633
+ 'Ჲ' => 'ჲ',
634
+ 'Ჳ' => 'ჳ',
635
+ 'Ჴ' => 'ჴ',
636
+ 'Ჵ' => 'ჵ',
637
+ 'Ჶ' => 'ჶ',
638
+ 'Ჷ' => 'ჷ',
639
+ 'Ჸ' => 'ჸ',
640
+ 'Ჹ' => 'ჹ',
641
+ 'Ჺ' => 'ჺ',
642
+ 'Ჽ' => 'ჽ',
643
+ 'Ჾ' => 'ჾ',
644
+ 'Ჿ' => 'ჿ',
645
  'Ḁ' => 'ḁ',
646
  'Ḃ' => 'ḃ',
647
  'Ḅ' => 'ḅ',
1125
  'Ɜ' => 'ɜ',
1126
  'Ɡ' => 'ɡ',
1127
  'Ɬ' => 'ɬ',
1128
+ 'Ɪ' => 'ɪ',
1129
  'Ʞ' => 'ʞ',
1130
  'Ʇ' => 'ʇ',
1131
+ 'Ʝ' => 'ʝ',
1132
+ 'Ꭓ' => 'ꭓ',
1133
+ 'Ꞵ' => 'ꞵ',
1134
+ 'Ꞷ' => 'ꞷ',
1135
+ 'Ꞹ' => 'ꞹ',
1136
+ 'Ꞻ' => 'ꞻ',
1137
+ 'Ꞽ' => 'ꞽ',
1138
+ 'Ꞿ' => 'ꞿ',
1139
+ 'Ꟃ' => 'ꟃ',
1140
+ 'Ꞔ' => 'ꞔ',
1141
+ 'Ʂ' => 'ʂ',
1142
+ 'Ᶎ' => 'ᶎ',
1143
+ 'Ꟈ' => 'ꟈ',
1144
+ 'Ꟊ' => 'ꟊ',
1145
+ 'Ꟶ' => 'ꟶ',
1146
  'A' => 'a',
1147
  'B' => 'b',
1148
  'C' => 'c',
1209
  '𐐥' => '𐑍',
1210
  '𐐦' => '𐑎',
1211
  '𐐧' => '𐑏',
1212
+ '𐒰' => '𐓘',
1213
+ '𐒱' => '𐓙',
1214
+ '𐒲' => '𐓚',
1215
+ '𐒳' => '𐓛',
1216
+ '𐒴' => '𐓜',
1217
+ '𐒵' => '𐓝',
1218
+ '𐒶' => '𐓞',
1219
+ '𐒷' => '𐓟',
1220
+ '𐒸' => '𐓠',
1221
+ '𐒹' => '𐓡',
1222
+ '𐒺' => '𐓢',
1223
+ '𐒻' => '𐓣',
1224
+ '𐒼' => '𐓤',
1225
+ '𐒽' => '𐓥',
1226
+ '𐒾' => '𐓦',
1227
+ '𐒿' => '𐓧',
1228
+ '𐓀' => '𐓨',
1229
+ '𐓁' => '𐓩',
1230
+ '𐓂' => '𐓪',
1231
+ '𐓃' => '𐓫',
1232
+ '𐓄' => '𐓬',
1233
+ '𐓅' => '𐓭',
1234
+ '𐓆' => '𐓮',
1235
+ '𐓇' => '𐓯',
1236
+ '𐓈' => '𐓰',
1237
+ '𐓉' => '𐓱',
1238
+ '𐓊' => '𐓲',
1239
+ '𐓋' => '𐓳',
1240
+ '𐓌' => '𐓴',
1241
+ '𐓍' => '𐓵',
1242
+ '𐓎' => '𐓶',
1243
+ '𐓏' => '𐓷',
1244
+ '𐓐' => '𐓸',
1245
+ '𐓑' => '𐓹',
1246
+ '𐓒' => '𐓺',
1247
+ '𐓓' => '𐓻',
1248
+ '𐲀' => '𐳀',
1249
+ '𐲁' => '𐳁',
1250
+ '𐲂' => '𐳂',
1251
+ '𐲃' => '𐳃',
1252
+ '𐲄' => '𐳄',
1253
+ '𐲅' => '𐳅',
1254
+ '𐲆' => '𐳆',
1255
+ '𐲇' => '𐳇',
1256
+ '𐲈' => '𐳈',
1257
+ '𐲉' => '𐳉',
1258
+ '𐲊' => '𐳊',
1259
+ '𐲋' => '𐳋',
1260
+ '𐲌' => '𐳌',
1261
+ '𐲍' => '𐳍',
1262
+ '𐲎' => '𐳎',
1263
+ '𐲏' => '𐳏',
1264
+ '𐲐' => '𐳐',
1265
+ '𐲑' => '𐳑',
1266
+ '𐲒' => '𐳒',
1267
+ '𐲓' => '𐳓',
1268
+ '𐲔' => '𐳔',
1269
+ '𐲕' => '𐳕',
1270
+ '𐲖' => '𐳖',
1271
+ '𐲗' => '𐳗',
1272
+ '𐲘' => '𐳘',
1273
+ '𐲙' => '𐳙',
1274
+ '𐲚' => '𐳚',
1275
+ '𐲛' => '𐳛',
1276
+ '𐲜' => '𐳜',
1277
+ '𐲝' => '𐳝',
1278
+ '𐲞' => '𐳞',
1279
+ '𐲟' => '𐳟',
1280
+ '𐲠' => '𐳠',
1281
+ '𐲡' => '𐳡',
1282
+ '𐲢' => '𐳢',
1283
+ '𐲣' => '𐳣',
1284
+ '𐲤' => '𐳤',
1285
+ '𐲥' => '𐳥',
1286
+ '𐲦' => '𐳦',
1287
+ '𐲧' => '𐳧',
1288
+ '𐲨' => '𐳨',
1289
+ '𐲩' => '𐳩',
1290
+ '𐲪' => '𐳪',
1291
+ '𐲫' => '𐳫',
1292
+ '𐲬' => '𐳬',
1293
+ '𐲭' => '𐳭',
1294
+ '𐲮' => '𐳮',
1295
+ '𐲯' => '𐳯',
1296
+ '𐲰' => '𐳰',
1297
+ '𐲱' => '𐳱',
1298
+ '𐲲' => '𐳲',
1299
  '𑢠' => '𑣀',
1300
  '𑢡' => '𑣁',
1301
  '𑢢' => '𑣂',
1328
  '𑢽' => '𑣝',
1329
  '𑢾' => '𑣞',
1330
  '𑢿' => '𑣟',
1331
+ '𖹀' => '𖹠',
1332
+ '𖹁' => '𖹡',
1333
+ '𖹂' => '𖹢',
1334
+ '𖹃' => '𖹣',
1335
+ '𖹄' => '𖹤',
1336
+ '𖹅' => '𖹥',
1337
+ '𖹆' => '𖹦',
1338
+ '𖹇' => '𖹧',
1339
+ '𖹈' => '𖹨',
1340
+ '𖹉' => '𖹩',
1341
+ '𖹊' => '𖹪',
1342
+ '𖹋' => '𖹫',
1343
+ '𖹌' => '𖹬',
1344
+ '𖹍' => '𖹭',
1345
+ '𖹎' => '𖹮',
1346
+ '𖹏' => '𖹯',
1347
+ '𖹐' => '𖹰',
1348
+ '𖹑' => '𖹱',
1349
+ '𖹒' => '𖹲',
1350
+ '𖹓' => '𖹳',
1351
+ '𖹔' => '𖹴',
1352
+ '𖹕' => '𖹵',
1353
+ '𖹖' => '𖹶',
1354
+ '𖹗' => '𖹷',
1355
+ '𖹘' => '𖹸',
1356
+ '𖹙' => '𖹹',
1357
+ '𖹚' => '𖹺',
1358
+ '𖹛' => '𖹻',
1359
+ '𖹜' => '𖹼',
1360
+ '𖹝' => '𖹽',
1361
+ '𖹞' => '𖹾',
1362
+ '𖹟' => '𖹿',
1363
+ '𞤀' => '𞤢',
1364
+ '𞤁' => '𞤣',
1365
+ '𞤂' => '𞤤',
1366
+ '𞤃' => '𞤥',
1367
+ '𞤄' => '𞤦',
1368
+ '𞤅' => '𞤧',
1369
+ '𞤆' => '𞤨',
1370
+ '𞤇' => '𞤩',
1371
+ '𞤈' => '𞤪',
1372
+ '𞤉' => '𞤫',
1373
+ '𞤊' => '𞤬',
1374
+ '𞤋' => '𞤭',
1375
+ '𞤌' => '𞤮',
1376
+ '𞤍' => '𞤯',
1377
+ '𞤎' => '𞤰',
1378
+ '𞤏' => '𞤱',
1379
+ '𞤐' => '𞤲',
1380
+ '𞤑' => '𞤳',
1381
+ '𞤒' => '𞤴',
1382
+ '𞤓' => '𞤵',
1383
+ '𞤔' => '𞤶',
1384
+ '𞤕' => '𞤷',
1385
+ '𞤖' => '𞤸',
1386
+ '𞤗' => '𞤹',
1387
+ '𞤘' => '𞤺',
1388
+ '𞤙' => '𞤻',
1389
+ '𞤚' => '𞤼',
1390
+ '𞤛' => '𞤽',
1391
+ '𞤜' => '𞤾',
1392
+ '𞤝' => '𞤿',
1393
+ '𞤞' => '𞥀',
1394
+ '𞤟' => '𞥁',
1395
+ '𞤠' => '𞥂',
1396
+ '𞤡' => '𞥃',
1397
  );
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- return array(
4
  'a' => 'A',
5
  'b' => 'B',
6
  'c' => 'C',
@@ -225,6 +225,7 @@ return array(
225
  'ɦ' => 'Ɦ',
226
  'ɨ' => 'Ɨ',
227
  'ɩ' => 'Ɩ',
 
228
  'ɫ' => 'Ɫ',
229
  'ɬ' => 'Ɬ',
230
  'ɯ' => 'Ɯ',
@@ -233,6 +234,7 @@ return array(
233
  'ɵ' => 'Ɵ',
234
  'ɽ' => 'Ɽ',
235
  'ʀ' => 'Ʀ',
 
236
  'ʃ' => 'Ʃ',
237
  'ʇ' => 'Ʇ',
238
  'ʈ' => 'Ʈ',
@@ -241,6 +243,7 @@ return array(
241
  'ʋ' => 'Ʋ',
242
  'ʌ' => 'Ʌ',
243
  'ʒ' => 'Ʒ',
 
244
  'ʞ' => 'Ʞ',
245
  'ͅ' => 'Ι',
246
  'ͱ' => 'Ͱ',
@@ -493,8 +496,70 @@ return array(
493
  'ք' => 'Ք',
494
  'օ' => 'Օ',
495
  'ֆ' => 'Ֆ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  'ᵹ' => 'Ᵹ',
497
  'ᵽ' => 'Ᵽ',
 
498
  'ḁ' => 'Ḁ',
499
  'ḃ' => 'Ḃ',
500
  'ḅ' => 'Ḅ',
@@ -681,41 +746,41 @@ return array(
681
  'ύ' => 'Ύ',
682
  'ὼ' => 'Ὼ',
683
  'ώ' => 'Ώ',
684
- 'ᾀ' => '',
685
- 'ᾁ' => '',
686
- 'ᾂ' => '',
687
- 'ᾃ' => '',
688
- 'ᾄ' => '',
689
- 'ᾅ' => '',
690
- 'ᾆ' => '',
691
- 'ᾇ' => '',
692
- 'ᾐ' => '',
693
- 'ᾑ' => '',
694
- 'ᾒ' => '',
695
- 'ᾓ' => '',
696
- 'ᾔ' => '',
697
- 'ᾕ' => '',
698
- 'ᾖ' => '',
699
- 'ᾗ' => '',
700
- 'ᾠ' => '',
701
- 'ᾡ' => '',
702
- 'ᾢ' => '',
703
- 'ᾣ' => '',
704
- 'ᾤ' => '',
705
- 'ᾥ' => '',
706
- 'ᾦ' => '',
707
- 'ᾧ' => '',
708
  'ᾰ' => 'Ᾰ',
709
  'ᾱ' => 'Ᾱ',
710
- 'ᾳ' => '',
711
  'ι' => 'Ι',
712
- 'ῃ' => '',
713
  'ῐ' => 'Ῐ',
714
  'ῑ' => 'Ῑ',
715
  'ῠ' => 'Ῠ',
716
  'ῡ' => 'Ῡ',
717
  'ῥ' => 'Ῥ',
718
- 'ῳ' => '',
719
  'ⅎ' => 'Ⅎ',
720
  'ⅰ' => 'Ⅰ',
721
  'ⅱ' => 'Ⅱ',
@@ -993,6 +1058,7 @@ return array(
993
  'ꞌ' => 'Ꞌ',
994
  'ꞑ' => 'Ꞑ',
995
  'ꞓ' => 'Ꞓ',
 
996
  'ꞗ' => 'Ꞗ',
997
  'ꞙ' => 'Ꞙ',
998
  'ꞛ' => 'Ꞛ',
@@ -1003,6 +1069,97 @@ return array(
1003
  'ꞥ' => 'Ꞥ',
1004
  'ꞧ' => 'Ꞧ',
1005
  'ꞩ' => 'Ꞩ',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1006
  'a' => 'A',
1007
  'b' => 'B',
1008
  'c' => 'C',
@@ -1069,6 +1226,93 @@ return array(
1069
  '𐑍' => '𐐥',
1070
  '𐑎' => '𐐦',
1071
  '𐑏' => '𐐧',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1072
  '𑣀' => '𑢠',
1073
  '𑣁' => '𑢡',
1074
  '𑣂' => '𑢢',
@@ -1101,4 +1345,145 @@ return array(
1101
  '𑣝' => '𑢽',
1102
  '𑣞' => '𑢾',
1103
  '𑣟' => '𑢿',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1104
  );
1
  <?php
2
 
3
+ return array (
4
  'a' => 'A',
5
  'b' => 'B',
6
  'c' => 'C',
225
  'ɦ' => 'Ɦ',
226
  'ɨ' => 'Ɨ',
227
  'ɩ' => 'Ɩ',
228
+ 'ɪ' => 'Ɪ',
229
  'ɫ' => 'Ɫ',
230
  'ɬ' => 'Ɬ',
231
  'ɯ' => 'Ɯ',
234
  'ɵ' => 'Ɵ',
235
  'ɽ' => 'Ɽ',
236
  'ʀ' => 'Ʀ',
237
+ 'ʂ' => 'Ʂ',
238
  'ʃ' => 'Ʃ',
239
  'ʇ' => 'Ʇ',
240
  'ʈ' => 'Ʈ',
243
  'ʋ' => 'Ʋ',
244
  'ʌ' => 'Ʌ',
245
  'ʒ' => 'Ʒ',
246
+ 'ʝ' => 'Ʝ',
247
  'ʞ' => 'Ʞ',
248
  'ͅ' => 'Ι',
249
  'ͱ' => 'Ͱ',
496
  'ք' => 'Ք',
497
  'օ' => 'Օ',
498
  'ֆ' => 'Ֆ',
499
+ 'ა' => 'Ა',
500
+ 'ბ' => 'Ბ',
501
+ 'გ' => 'Გ',
502
+ 'დ' => 'Დ',
503
+ 'ე' => 'Ე',
504
+ 'ვ' => 'Ვ',
505
+ 'ზ' => 'Ზ',
506
+ 'თ' => 'Თ',
507
+ 'ი' => 'Ი',
508
+ 'კ' => 'Კ',
509
+ 'ლ' => 'Ლ',
510
+ 'მ' => 'Მ',
511
+ 'ნ' => 'Ნ',
512
+ 'ო' => 'Ო',
513
+ 'პ' => 'Პ',
514
+ 'ჟ' => 'Ჟ',
515
+ 'რ' => 'Რ',
516
+ 'ს' => 'Ს',
517
+ 'ტ' => 'Ტ',
518
+ 'უ' => 'Უ',
519
+ 'ფ' => 'Ფ',
520
+ 'ქ' => 'Ქ',
521
+ 'ღ' => 'Ღ',
522
+ 'ყ' => 'Ყ',
523
+ 'შ' => 'Შ',
524
+ 'ჩ' => 'Ჩ',
525
+ 'ც' => 'Ც',
526
+ 'ძ' => 'Ძ',
527
+ 'წ' => 'Წ',
528
+ 'ჭ' => 'Ჭ',
529
+ 'ხ' => 'Ხ',
530
+ 'ჯ' => 'Ჯ',
531
+ 'ჰ' => 'Ჰ',
532
+ 'ჱ' => 'Ჱ',
533
+ 'ჲ' => 'Ჲ',
534
+ 'ჳ' => 'Ჳ',
535
+ 'ჴ' => 'Ჴ',
536
+ 'ჵ' => 'Ჵ',
537
+ 'ჶ' => 'Ჶ',
538
+ 'ჷ' => 'Ჷ',
539
+ 'ჸ' => 'Ჸ',
540
+ 'ჹ' => 'Ჹ',
541
+ 'ჺ' => 'Ჺ',
542
+ 'ჽ' => 'Ჽ',
543
+ 'ჾ' => 'Ჾ',
544
+ 'ჿ' => 'Ჿ',
545
+ 'ᏸ' => 'Ᏸ',
546
+ 'ᏹ' => 'Ᏹ',
547
+ 'ᏺ' => 'Ᏺ',
548
+ 'ᏻ' => 'Ᏻ',
549
+ 'ᏼ' => 'Ᏼ',
550
+ 'ᏽ' => 'Ᏽ',
551
+ 'ᲀ' => 'В',
552
+ 'ᲁ' => 'Д',
553
+ 'ᲂ' => 'О',
554
+ 'ᲃ' => 'С',
555
+ 'ᲄ' => 'Т',
556
+ 'ᲅ' => 'Т',
557
+ 'ᲆ' => 'Ъ',
558
+ 'ᲇ' => 'Ѣ',
559
+ 'ᲈ' => 'Ꙋ',
560
  'ᵹ' => 'Ᵹ',
561
  'ᵽ' => 'Ᵽ',
562
+ 'ᶎ' => 'Ᶎ',
563
  'ḁ' => 'Ḁ',
564
  'ḃ' => 'Ḃ',
565
  'ḅ' => 'Ḅ',
746
  'ύ' => 'Ύ',
747
  'ὼ' => 'Ὼ',
748
  'ώ' => 'Ώ',
749
+ 'ᾀ' => 'ἈΙ',
750
+ 'ᾁ' => 'ἉΙ',
751
+ 'ᾂ' => 'ἊΙ',
752
+ 'ᾃ' => 'ἋΙ',
753
+ 'ᾄ' => 'ἌΙ',
754
+ 'ᾅ' => 'ἍΙ',
755
+ 'ᾆ' => 'ἎΙ',
756
+ 'ᾇ' => 'ἏΙ',
757
+ 'ᾐ' => 'ἨΙ',
758
+ 'ᾑ' => 'ἩΙ',
759
+ 'ᾒ' => 'ἪΙ',
760
+ 'ᾓ' => 'ἫΙ',
761
+ 'ᾔ' => 'ἬΙ',
762
+ 'ᾕ' => 'ἭΙ',
763
+ 'ᾖ' => 'ἮΙ',
764
+ 'ᾗ' => 'ἯΙ',
765
+ 'ᾠ' => 'ὨΙ',
766
+ 'ᾡ' => 'ὩΙ',
767
+ 'ᾢ' => 'ὪΙ',
768
+ 'ᾣ' => 'ὫΙ',
769
+ 'ᾤ' => 'ὬΙ',
770
+ 'ᾥ' => 'ὭΙ',
771
+ 'ᾦ' => 'ὮΙ',
772
+ 'ᾧ' => 'ὯΙ',
773
  'ᾰ' => 'Ᾰ',
774
  'ᾱ' => 'Ᾱ',
775
+ 'ᾳ' => 'ΑΙ',
776
  'ι' => 'Ι',
777
+ 'ῃ' => 'ΗΙ',
778
  'ῐ' => 'Ῐ',
779
  'ῑ' => 'Ῑ',
780
  'ῠ' => 'Ῠ',
781
  'ῡ' => 'Ῡ',
782
  'ῥ' => 'Ῥ',
783
+ 'ῳ' => 'ΩΙ',
784
  'ⅎ' => 'Ⅎ',
785
  'ⅰ' => 'Ⅰ',
786
  'ⅱ' => 'Ⅱ',
1058
  'ꞌ' => 'Ꞌ',
1059
  'ꞑ' => 'Ꞑ',
1060
  'ꞓ' => 'Ꞓ',
1061
+ 'ꞔ' => 'Ꞔ',
1062
  'ꞗ' => 'Ꞗ',
1063
  'ꞙ' => 'Ꞙ',
1064
  'ꞛ' => 'Ꞛ',
1069
  'ꞥ' => 'Ꞥ',
1070
  'ꞧ' => 'Ꞧ',
1071
  'ꞩ' => 'Ꞩ',
1072
+ 'ꞵ' => 'Ꞵ',
1073
+ 'ꞷ' => 'Ꞷ',
1074
+ 'ꞹ' => 'Ꞹ',
1075
+ 'ꞻ' => 'Ꞻ',
1076
+ 'ꞽ' => 'Ꞽ',
1077
+ 'ꞿ' => 'Ꞿ',
1078
+ 'ꟃ' => 'Ꟃ',
1079
+ 'ꟈ' => 'Ꟈ',
1080
+ 'ꟊ' => 'Ꟊ',
1081
+ 'ꟶ' => 'Ꟶ',
1082
+ 'ꭓ' => 'Ꭓ',
1083
+ 'ꭰ' => 'Ꭰ',
1084
+ 'ꭱ' => 'Ꭱ',
1085
+ 'ꭲ' => 'Ꭲ',
1086
+ 'ꭳ' => 'Ꭳ',
1087
+ 'ꭴ' => 'Ꭴ',
1088
+ 'ꭵ' => 'Ꭵ',
1089
+ 'ꭶ' => 'Ꭶ',
1090
+ 'ꭷ' => 'Ꭷ',
1091
+ 'ꭸ' => 'Ꭸ',
1092
+ 'ꭹ' => 'Ꭹ',
1093
+ 'ꭺ' => 'Ꭺ',
1094
+ 'ꭻ' => 'Ꭻ',
1095
+ 'ꭼ' => 'Ꭼ',
1096
+ 'ꭽ' => 'Ꭽ',
1097
+ 'ꭾ' => 'Ꭾ',
1098
+ 'ꭿ' => 'Ꭿ',
1099
+ 'ꮀ' => 'Ꮀ',
1100
+ 'ꮁ' => 'Ꮁ',
1101
+ 'ꮂ' => 'Ꮂ',
1102
+ 'ꮃ' => 'Ꮃ',
1103
+ 'ꮄ' => 'Ꮄ',
1104
+ 'ꮅ' => 'Ꮅ',
1105
+ 'ꮆ' => 'Ꮆ',
1106
+ 'ꮇ' => 'Ꮇ',
1107
+ 'ꮈ' => 'Ꮈ',
1108
+ 'ꮉ' => 'Ꮉ',
1109
+ 'ꮊ' => 'Ꮊ',
1110
+ 'ꮋ' => 'Ꮋ',
1111
+ 'ꮌ' => 'Ꮌ',
1112
+ 'ꮍ' => 'Ꮍ',
1113
+ 'ꮎ' => 'Ꮎ',
1114
+ 'ꮏ' => 'Ꮏ',
1115
+ 'ꮐ' => 'Ꮐ',
1116
+ 'ꮑ' => 'Ꮑ',
1117
+ 'ꮒ' => 'Ꮒ',
1118
+ 'ꮓ' => 'Ꮓ',
1119
+ 'ꮔ' => 'Ꮔ',
1120
+ 'ꮕ' => 'Ꮕ',
1121
+ 'ꮖ' => 'Ꮖ',
1122
+ 'ꮗ' => 'Ꮗ',
1123
+ 'ꮘ' => 'Ꮘ',
1124
+ 'ꮙ' => 'Ꮙ',
1125
+ 'ꮚ' => 'Ꮚ',
1126
+ 'ꮛ' => 'Ꮛ',
1127
+ 'ꮜ' => 'Ꮜ',
1128
+ 'ꮝ' => 'Ꮝ',
1129
+ 'ꮞ' => 'Ꮞ',
1130
+ 'ꮟ' => 'Ꮟ',
1131
+ 'ꮠ' => 'Ꮠ',
1132
+ 'ꮡ' => 'Ꮡ',
1133
+ 'ꮢ' => 'Ꮢ',
1134
+ 'ꮣ' => 'Ꮣ',
1135
+ 'ꮤ' => 'Ꮤ',
1136
+ 'ꮥ' => 'Ꮥ',
1137
+ 'ꮦ' => 'Ꮦ',
1138
+ 'ꮧ' => 'Ꮧ',
1139
+ 'ꮨ' => 'Ꮨ',
1140
+ 'ꮩ' => 'Ꮩ',
1141
+ 'ꮪ' => 'Ꮪ',
1142
+ 'ꮫ' => 'Ꮫ',
1143
+ 'ꮬ' => 'Ꮬ',
1144
+ 'ꮭ' => 'Ꮭ',
1145
+ 'ꮮ' => 'Ꮮ',
1146
+ 'ꮯ' => 'Ꮯ',
1147
+ 'ꮰ' => 'Ꮰ',
1148
+ 'ꮱ' => 'Ꮱ',
1149
+ 'ꮲ' => 'Ꮲ',
1150
+ 'ꮳ' => 'Ꮳ',
1151
+ 'ꮴ' => 'Ꮴ',
1152
+ 'ꮵ' => 'Ꮵ',
1153
+ 'ꮶ' => 'Ꮶ',
1154
+ 'ꮷ' => 'Ꮷ',
1155
+ 'ꮸ' => 'Ꮸ',
1156
+ 'ꮹ' => 'Ꮹ',
1157
+ 'ꮺ' => 'Ꮺ',
1158
+ 'ꮻ' => 'Ꮻ',
1159
+ 'ꮼ' => 'Ꮼ',
1160
+ 'ꮽ' => 'Ꮽ',
1161
+ 'ꮾ' => 'Ꮾ',
1162
+ 'ꮿ' => 'Ꮿ',
1163
  'a' => 'A',
1164
  'b' => 'B',
1165
  'c' => 'C',
1226
  '𐑍' => '𐐥',
1227
  '𐑎' => '𐐦',
1228
  '𐑏' => '𐐧',
1229
+ '𐓘' => '𐒰',
1230
+ '𐓙' => '𐒱',
1231
+ '𐓚' => '𐒲',
1232
+ '𐓛' => '𐒳',
1233
+ '𐓜' => '𐒴',
1234
+ '𐓝' => '𐒵',
1235
+ '𐓞' => '𐒶',
1236
+ '𐓟' => '𐒷',
1237
+ '𐓠' => '𐒸',
1238
+ '𐓡' => '𐒹',
1239
+ '𐓢' => '𐒺',
1240
+ '𐓣' => '𐒻',
1241
+ '𐓤' => '𐒼',
1242
+ '𐓥' => '𐒽',
1243
+ '𐓦' => '𐒾',
1244
+ '𐓧' => '𐒿',
1245
+ '𐓨' => '𐓀',
1246
+ '𐓩' => '𐓁',
1247
+ '𐓪' => '𐓂',
1248
+ '𐓫' => '𐓃',
1249
+ '𐓬' => '𐓄',
1250
+ '𐓭' => '𐓅',
1251
+ '𐓮' => '𐓆',
1252
+ '𐓯' => '𐓇',
1253
+ '𐓰' => '𐓈',
1254
+ '𐓱' => '𐓉',
1255
+ '𐓲' => '𐓊',
1256
+ '𐓳' => '𐓋',
1257
+ '𐓴' => '𐓌',
1258
+ '𐓵' => '𐓍',
1259
+ '𐓶' => '𐓎',
1260
+ '𐓷' => '𐓏',
1261
+ '𐓸' => '𐓐',
1262
+ '𐓹' => '𐓑',
1263
+ '𐓺' => '𐓒',
1264
+ '𐓻' => '𐓓',
1265
+ '𐳀' => '𐲀',
1266
+ '𐳁' => '𐲁',
1267
+ '𐳂' => '𐲂',
1268
+ '𐳃' => '𐲃',
1269
+ '𐳄' => '𐲄',
1270
+ '𐳅' => '𐲅',
1271
+ '𐳆' => '𐲆',
1272
+ '𐳇' => '𐲇',
1273
+ '𐳈' => '𐲈',
1274
+ '𐳉' => '𐲉',
1275
+ '𐳊' => '𐲊',
1276
+ '𐳋' => '𐲋',
1277
+ '𐳌' => '𐲌',
1278
+ '𐳍' => '𐲍',
1279
+ '𐳎' => '𐲎',
1280
+ '𐳏' => '𐲏',
1281
+ '𐳐' => '𐲐',
1282
+ '𐳑' => '𐲑',
1283
+ '𐳒' => '𐲒',
1284
+ '𐳓' => '𐲓',
1285
+ '𐳔' => '𐲔',
1286
+ '𐳕' => '𐲕',
1287
+ '𐳖' => '𐲖',
1288
+ '𐳗' => '𐲗',
1289
+ '𐳘' => '𐲘',
1290
+ '𐳙' => '𐲙',
1291
+ '𐳚' => '𐲚',
1292
+ '𐳛' => '𐲛',
1293
+ '𐳜' => '𐲜',
1294
+ '𐳝' => '𐲝',
1295
+ '𐳞' => '𐲞',
1296
+ '𐳟' => '𐲟',
1297
+ '𐳠' => '𐲠',
1298
+ '𐳡' => '𐲡',
1299
+ '𐳢' => '𐲢',
1300
+ '𐳣' => '𐲣',
1301
+ '𐳤' => '𐲤',
1302
+ '𐳥' => '𐲥',
1303
+ '𐳦' => '𐲦',
1304
+ '𐳧' => '𐲧',
1305
+ '𐳨' => '𐲨',
1306
+ '𐳩' => '𐲩',
1307
+ '𐳪' => '𐲪',
1308
+ '𐳫' => '𐲫',
1309
+ '𐳬' => '𐲬',
1310
+ '𐳭' => '𐲭',
1311
+ '𐳮' => '𐲮',
1312
+ '𐳯' => '𐲯',
1313
+ '𐳰' => '𐲰',
1314
+ '𐳱' => '𐲱',
1315
+ '𐳲' => '𐲲',
1316
  '𑣀' => '𑢠',
1317
  '𑣁' => '𑢡',
1318
  '𑣂' => '𑢢',
1345
  '𑣝' => '𑢽',
1346
  '𑣞' => '𑢾',
1347
  '𑣟' => '𑢿',
1348
+ '𖹠' => '𖹀',
1349
+ '𖹡' => '𖹁',
1350
+ '𖹢' => '𖹂',
1351
+ '𖹣' => '𖹃',
1352
+ '𖹤' => '𖹄',
1353
+ '𖹥' => '𖹅',
1354
+ '𖹦' => '𖹆',
1355
+ '𖹧' => '𖹇',
1356
+ '𖹨' => '𖹈',
1357
+ '𖹩' => '𖹉',
1358
+ '𖹪' => '𖹊',
1359
+ '𖹫' => '𖹋',
1360
+ '𖹬' => '𖹌',
1361
+ '𖹭' => '𖹍',
1362
+ '𖹮' => '𖹎',
1363
+ '𖹯' => '𖹏',
1364
+ '𖹰' => '𖹐',
1365
+ '𖹱' => '𖹑',
1366
+ '𖹲' => '𖹒',
1367
+ '𖹳' => '𖹓',
1368
+ '𖹴' => '𖹔',
1369
+ '𖹵' => '𖹕',
1370
+ '𖹶' => '𖹖',
1371
+ '𖹷' => '𖹗',
1372
+ '𖹸' => '𖹘',
1373
+ '𖹹' => '𖹙',
1374
+ '𖹺' => '𖹚',
1375
+ '𖹻' => '𖹛',
1376
+ '𖹼' => '𖹜',
1377
+ '𖹽' => '𖹝',
1378
+ '𖹾' => '𖹞',
1379
+ '𖹿' => '𖹟',
1380
+ '𞤢' => '𞤀',
1381
+ '𞤣' => '𞤁',
1382
+ '𞤤' => '𞤂',
1383
+ '𞤥' => '𞤃',
1384
+ '𞤦' => '𞤄',
1385
+ '𞤧' => '𞤅',
1386
+ '𞤨' => '𞤆',
1387
+ '𞤩' => '𞤇',
1388
+ '𞤪' => '𞤈',
1389
+ '𞤫' => '𞤉',
1390
+ '𞤬' => '𞤊',
1391
+ '𞤭' => '𞤋',
1392
+ '𞤮' => '𞤌',
1393
+ '𞤯' => '𞤍',
1394
+ '𞤰' => '𞤎',
1395
+ '𞤱' => '𞤏',
1396
+ '𞤲' => '𞤐',
1397
+ '𞤳' => '𞤑',
1398
+ '𞤴' => '𞤒',
1399
+ '𞤵' => '𞤓',
1400
+ '𞤶' => '𞤔',
1401
+ '𞤷' => '𞤕',
1402
+ '𞤸' => '𞤖',
1403
+ '𞤹' => '𞤗',
1404
+ '𞤺' => '𞤘',
1405
+ '𞤻' => '𞤙',
1406
+ '𞤼' => '𞤚',
1407
+ '𞤽' => '𞤛',
1408
+ '𞤾' => '𞤜',
1409
+ '𞤿' => '𞤝',
1410
+ '𞥀' => '𞤞',
1411
+ '𞥁' => '𞤟',
1412
+ '𞥂' => '𞤠',
1413
+ '𞥃' => '𞤡',
1414
+ 'ß' => 'SS',
1415
+ 'ff' => 'FF',
1416
+ 'fi' => 'FI',
1417
+ 'fl' => 'FL',
1418
+ 'ffi' => 'FFI',
1419
+ 'ffl' => 'FFL',
1420
+ 'ſt' => 'ST',
1421
+ 'st' => 'ST',
1422
+ 'և' => 'ԵՒ',
1423
+ 'ﬓ' => 'ՄՆ',
1424
+ 'ﬔ' => 'ՄԵ',
1425
+ 'ﬕ' => 'ՄԻ',
1426
+ 'ﬖ' => 'ՎՆ',
1427
+ 'ﬗ' => 'ՄԽ',
1428
+ 'ʼn' => 'ʼN',
1429
+ 'ΐ' => 'Ϊ́',
1430
+ 'ΰ' => 'Ϋ́',
1431
+ 'ǰ' => 'J̌',
1432
+ 'ẖ' => 'H̱',
1433
+ 'ẗ' => 'T̈',
1434
+ 'ẘ' => 'W̊',
1435
+ 'ẙ' => 'Y̊',
1436
+ 'ẚ' => 'Aʾ',
1437
+ 'ὐ' => 'Υ̓',
1438
+ 'ὒ' => 'Υ̓̀',
1439
+ 'ὔ' => 'Υ̓́',
1440
+ 'ὖ' => 'Υ̓͂',
1441
+ 'ᾶ' => 'Α͂',
1442
+ 'ῆ' => 'Η͂',
1443
+ 'ῒ' => 'Ϊ̀',
1444
+ 'ΐ' => 'Ϊ́',
1445
+ 'ῖ' => 'Ι͂',
1446
+ 'ῗ' => 'Ϊ͂',
1447
+ 'ῢ' => 'Ϋ̀',
1448
+ 'ΰ' => 'Ϋ́',
1449
+ 'ῤ' => 'Ρ̓',
1450
+ 'ῦ' => 'Υ͂',
1451
+ 'ῧ' => 'Ϋ͂',
1452
+ 'ῶ' => 'Ω͂',
1453
+ 'ᾈ' => 'ἈΙ',
1454
+ 'ᾉ' => 'ἉΙ',
1455
+ 'ᾊ' => 'ἊΙ',
1456
+ 'ᾋ' => 'ἋΙ',
1457
+ 'ᾌ' => 'ἌΙ',
1458
+ 'ᾍ' => 'ἍΙ',
1459
+ 'ᾎ' => 'ἎΙ',
1460
+ 'ᾏ' => 'ἏΙ',
1461
+ 'ᾘ' => 'ἨΙ',
1462
+ 'ᾙ' => 'ἩΙ',
1463
+ 'ᾚ' => 'ἪΙ',
1464
+ 'ᾛ' => 'ἫΙ',
1465
+ 'ᾜ' => 'ἬΙ',
1466
+ 'ᾝ' => 'ἭΙ',
1467
+ 'ᾞ' => 'ἮΙ',
1468
+ 'ᾟ' => 'ἯΙ',
1469
+ 'ᾨ' => 'ὨΙ',
1470
+ 'ᾩ' => 'ὩΙ',
1471
+ 'ᾪ' => 'ὪΙ',
1472
+ 'ᾫ' => 'ὫΙ',
1473
+ 'ᾬ' => 'ὬΙ',
1474
+ 'ᾭ' => 'ὭΙ',
1475
+ 'ᾮ' => 'ὮΙ',
1476
+ 'ᾯ' => 'ὯΙ',
1477
+ 'ᾼ' => 'ΑΙ',
1478
+ 'ῌ' => 'ΗΙ',
1479
+ 'ῼ' => 'ΩΙ',
1480
+ 'ᾲ' => 'ᾺΙ',
1481
+ 'ᾴ' => 'ΆΙ',
1482
+ 'ῂ' => 'ῊΙ',
1483
+ 'ῄ' => 'ΉΙ',
1484
+ 'ῲ' => 'ῺΙ',
1485
+ 'ῴ' => 'ΏΙ',
1486
+ 'ᾷ' => 'Α͂Ι',
1487
+ 'ῇ' => 'Η͂Ι',
1488
+ 'ῷ' => 'Ω͂Ι',
1489
  );
vendor/symfony/polyfill-mbstring/bootstrap.php CHANGED
@@ -11,29 +11,33 @@
11
 
12
  use Symfony\Polyfill\Mbstring as p;
13
 
 
 
 
 
14
  if (!function_exists('mb_convert_encoding')) {
15
- function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
16
  }
17
  if (!function_exists('mb_decode_mimeheader')) {
18
- function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
19
  }
20
  if (!function_exists('mb_encode_mimeheader')) {
21
- function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
22
  }
23
  if (!function_exists('mb_decode_numericentity')) {
24
- function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }
25
  }
26
  if (!function_exists('mb_encode_numericentity')) {
27
- function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }
28
  }
29
  if (!function_exists('mb_convert_case')) {
30
- function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
31
  }
32
  if (!function_exists('mb_internal_encoding')) {
33
- function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
34
  }
35
  if (!function_exists('mb_language')) {
36
- function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
37
  }
38
  if (!function_exists('mb_list_encodings')) {
39
  function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
@@ -42,88 +46,90 @@ if (!function_exists('mb_encoding_aliases')) {
42
  function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
43
  }
44
  if (!function_exists('mb_check_encoding')) {
45
- function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
46
  }
47
  if (!function_exists('mb_detect_encoding')) {
48
- function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
49
  }
50
  if (!function_exists('mb_detect_order')) {
51
- function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
52
  }
53
  if (!function_exists('mb_parse_str')) {
54
- function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
55
  }
56
  if (!function_exists('mb_strlen')) {
57
- function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
58
  }
59
  if (!function_exists('mb_strpos')) {
60
- function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
61
  }
62
  if (!function_exists('mb_strtolower')) {
63
- function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
64
  }
65
  if (!function_exists('mb_strtoupper')) {
66
- function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
67
  }
68
  if (!function_exists('mb_substitute_character')) {
69
- function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
70
  }
71
  if (!function_exists('mb_substr')) {
72
- function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
73
  }
74
  if (!function_exists('mb_stripos')) {
75
- function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
76
  }
77
  if (!function_exists('mb_stristr')) {
78
- function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
79
  }
80
  if (!function_exists('mb_strrchr')) {
81
- function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
82
  }
83
  if (!function_exists('mb_strrichr')) {
84
- function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
85
  }
86
  if (!function_exists('mb_strripos')) {
87
- function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
88
  }
89
  if (!function_exists('mb_strrpos')) {
90
- function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
91
  }
92
  if (!function_exists('mb_strstr')) {
93
- function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
94
  }
95
  if (!function_exists('mb_get_info')) {
96
  function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
97
  }
98
  if (!function_exists('mb_http_output')) {
99
- function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
100
  }
101
  if (!function_exists('mb_strwidth')) {
102
- function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
103
  }
104
  if (!function_exists('mb_substr_count')) {
105
- function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
106
  }
107
  if (!function_exists('mb_output_handler')) {
108
- function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
109
  }
110
  if (!function_exists('mb_http_input')) {
111
- function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
112
  }
 
113
  if (!function_exists('mb_convert_variables')) {
114
- function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); }
115
  }
 
116
  if (!function_exists('mb_ord')) {
117
- function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); }
118
  }
119
  if (!function_exists('mb_chr')) {
120
- function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
121
  }
122
  if (!function_exists('mb_scrub')) {
123
- function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
124
  }
125
  if (!function_exists('mb_str_split')) {
126
- function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); }
127
  }
128
 
129
  if (extension_loaded('mbstring')) {
11
 
12
  use Symfony\Polyfill\Mbstring as p;
13
 
14
+ if (\PHP_VERSION_ID >= 80000) {
15
+ return require __DIR__.'/bootstrap80.php';
16
+ }
17
+
18
  if (!function_exists('mb_convert_encoding')) {
19
+ function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
20
  }
21
  if (!function_exists('mb_decode_mimeheader')) {
22
+ function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
23
  }
24
  if (!function_exists('mb_encode_mimeheader')) {
25
+ function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
26
  }
27
  if (!function_exists('mb_decode_numericentity')) {
28
+ function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
29
  }
30
  if (!function_exists('mb_encode_numericentity')) {
31
+ function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
32
  }
33
  if (!function_exists('mb_convert_case')) {
34
+ function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
35
  }
36
  if (!function_exists('mb_internal_encoding')) {
37
+ function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
38
  }
39
  if (!function_exists('mb_language')) {
40
+ function mb_language($language = null) { return p\Mbstring::mb_language($language); }
41
  }
42
  if (!function_exists('mb_list_encodings')) {
43
  function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
46
  function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
47
  }
48
  if (!function_exists('mb_check_encoding')) {
49
+ function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
50
  }
51
  if (!function_exists('mb_detect_encoding')) {
52
+ function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
53
  }
54
  if (!function_exists('mb_detect_order')) {
55
+ function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
56
  }
57
  if (!function_exists('mb_parse_str')) {
58
+ function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; }
59
  }
60
  if (!function_exists('mb_strlen')) {
61
+ function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
62
  }
63
  if (!function_exists('mb_strpos')) {
64
+ function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
65
  }
66
  if (!function_exists('mb_strtolower')) {
67
+ function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
68
  }
69
  if (!function_exists('mb_strtoupper')) {
70
+ function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
71
  }
72
  if (!function_exists('mb_substitute_character')) {
73
+ function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
74
  }
75
  if (!function_exists('mb_substr')) {
76
+ function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
77
  }
78
  if (!function_exists('mb_stripos')) {
79
+ function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
80
  }
81
  if (!function_exists('mb_stristr')) {
82
+ function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
83
  }
84
  if (!function_exists('mb_strrchr')) {
85
+ function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
86
  }
87
  if (!function_exists('mb_strrichr')) {
88
+ function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
89
  }
90
  if (!function_exists('mb_strripos')) {
91
+ function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
92
  }
93
  if (!function_exists('mb_strrpos')) {
94
+ function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
95
  }
96
  if (!function_exists('mb_strstr')) {
97
+ function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
98
  }
99
  if (!function_exists('mb_get_info')) {
100
  function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
101
  }
102
  if (!function_exists('mb_http_output')) {
103
+ function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
104
  }
105
  if (!function_exists('mb_strwidth')) {
106
+ function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
107
  }
108
  if (!function_exists('mb_substr_count')) {
109
+ function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
110
  }
111
  if (!function_exists('mb_output_handler')) {
112
+ function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
113
  }
114
  if (!function_exists('mb_http_input')) {
115
+ function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); }
116
  }
117
+
118
  if (!function_exists('mb_convert_variables')) {
119
+ function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
120
  }
121
+
122
  if (!function_exists('mb_ord')) {
123
+ function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
124
  }
125
  if (!function_exists('mb_chr')) {
126
+ function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); }
127
  }
128
  if (!function_exists('mb_scrub')) {
129
+ function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }
130
  }
131
  if (!function_exists('mb_str_split')) {
132
+ function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
133
  }
134
 
135
  if (extension_loaded('mbstring')) {
vendor/symfony/polyfill-mbstring/bootstrap80.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Mbstring as p;
13
+
14
+ if (!function_exists('mb_convert_encoding')) {
15
+ function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); }
16
+ }
17
+ if (!function_exists('mb_decode_mimeheader')) {
18
+ function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); }
19
+ }
20
+ if (!function_exists('mb_encode_mimeheader')) {
21
+ function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); }
22
+ }
23
+ if (!function_exists('mb_decode_numericentity')) {
24
+ function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); }
25
+ }
26
+ if (!function_exists('mb_encode_numericentity')) {
27
+ function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); }
28
+ }
29
+ if (!function_exists('mb_convert_case')) {
30
+ function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); }
31
+ }
32
+ if (!function_exists('mb_internal_encoding')) {
33
+ function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); }
34
+ }
35
+ if (!function_exists('mb_language')) {
36
+ function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); }
37
+ }
38
+ if (!function_exists('mb_list_encodings')) {
39
+ function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); }
40
+ }
41
+ if (!function_exists('mb_encoding_aliases')) {
42
+ function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); }
43
+ }
44
+ if (!function_exists('mb_check_encoding')) {
45
+ function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); }
46
+ }
47
+ if (!function_exists('mb_detect_encoding')) {
48
+ function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); }
49
+ }
50
+ if (!function_exists('mb_detect_order')) {
51
+ function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); }
52
+ }
53
+ if (!function_exists('mb_parse_str')) {
54
+ function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; }
55
+ }
56
+ if (!function_exists('mb_strlen')) {
57
+ function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); }
58
+ }
59
+ if (!function_exists('mb_strpos')) {
60
+ function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
61
+ }
62
+ if (!function_exists('mb_strtolower')) {
63
+ function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); }
64
+ }
65
+ if (!function_exists('mb_strtoupper')) {
66
+ function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); }
67
+ }
68
+ if (!function_exists('mb_substitute_character')) {
69
+ function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); }
70
+ }
71
+ if (!function_exists('mb_substr')) {
72
+ function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); }
73
+ }
74
+ if (!function_exists('mb_stripos')) {
75
+ function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
76
+ }
77
+ if (!function_exists('mb_stristr')) {
78
+ function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
79
+ }
80
+ if (!function_exists('mb_strrchr')) {
81
+ function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
82
+ }
83
+ if (!function_exists('mb_strrichr')) {
84
+ function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
85
+ }
86
+ if (!function_exists('mb_strripos')) {
87
+ function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
88
+ }
89
+ if (!function_exists('mb_strrpos')) {
90
+ function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); }
91
+ }
92
+ if (!function_exists('mb_strstr')) {
93
+ function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); }
94
+ }
95
+ if (!function_exists('mb_get_info')) {
96
+ function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); }
97
+ }
98
+ if (!function_exists('mb_http_output')) {
99
+ function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); }
100
+ }
101
+ if (!function_exists('mb_strwidth')) {
102
+ function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); }
103
+ }
104
+ if (!function_exists('mb_substr_count')) {
105
+ function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); }
106
+ }
107
+ if (!function_exists('mb_output_handler')) {
108
+ function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); }
109
+ }
110
+ if (!function_exists('mb_http_input')) {
111
+ function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); }
112
+ }
113
+
114
+ if (!function_exists('mb_convert_variables')) {
115
+ function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); }
116
+ }
117
+
118
+ if (!function_exists('mb_ord')) {
119
+ function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); }
120
+ }
121
+ if (!function_exists('mb_chr')) {
122
+ function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); }
123
+ }
124
+ if (!function_exists('mb_scrub')) {
125
+ function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); }
126
+ }
127
+ if (!function_exists('mb_str_split')) {
128
+ function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); }
129
+ }
130
+
131
+ if (extension_loaded('mbstring')) {
132
+ return;
133
+ }
134
+
135
+ if (!defined('MB_CASE_UPPER')) {
136
+ define('MB_CASE_UPPER', 0);
137
+ }
138
+ if (!defined('MB_CASE_LOWER')) {
139
+ define('MB_CASE_LOWER', 1);
140
+ }
141
+ if (!defined('MB_CASE_TITLE')) {
142
+ define('MB_CASE_TITLE', 2);
143
+ }
vendor/symfony/polyfill-mbstring/composer.json CHANGED
@@ -16,7 +16,10 @@
16
  }
17
  ],
18
  "require": {
19
- "php": ">=5.3.3"
 
 
 
20
  },
21
  "autoload": {
22
  "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
@@ -28,7 +31,11 @@
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
- "dev-master": "1.17-dev"
 
 
 
 
32
  }
33
  }
34
  }
16
  }
17
  ],
18
  "require": {
19
+ "php": ">=7.1"
20
+ },
21
+ "provide": {
22
+ "ext-mbstring": "*"
23
  },
24
  "autoload": {
25
  "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
31
  "minimum-stability": "dev",
32
  "extra": {
33
  "branch-alias": {
34
+ "dev-main": "1.26-dev"
35
+ },
36
+ "thanks": {
37
+ "name": "symfony/polyfill",
38
+ "url": "https://github.com/symfony/polyfill"
39
  }
40
  }
41
  }