GeoIP Detection - Version 4.0.0

Version Description

Improving Shortcodes (and Shortcodes for AJAX!) New Minimum Requirements: PHP 7.2.5, and if you use WooCommerce it needs to be 3.9.0 or later.

Download this release

Release Info

Developer benjamin4
Plugin Icon 128x128 GeoIP Detection
Version 4.0.0
Comparing to
See all releases

Code changes from version 3.3.0 to 4.0.0

Files changed (164) hide show
  1. CONTRIBUTING.md +14 -7
  2. admin-ui.php +11 -2
  3. ajax.php +5 -12
  4. api.php +26 -8
  5. api_shortcodes.php +35 -0
  6. check_requirements.php +40 -3
  7. composer.json +12 -3
  8. composer.lock +2000 -120
  9. data-sources/abstract.php +2 -2
  10. data-sources/auto.php +2 -0
  11. data-sources/header.php +2 -2
  12. data-sources/hostinfo.php +3 -3
  13. data-sources/ipstack.php +6 -5
  14. data-sources/manual.php +26 -8
  15. data-sources/precision.php +1 -1
  16. data-sources/registry.php +13 -0
  17. deprecated.php +29 -1
  18. geoip-detect-lib.php +39 -18
  19. geoip-detect.php +15 -7
  20. js/body_classes.js +32 -0
  21. js/dist/frontend.2e78f904.js +41 -0
  22. js/dist/frontend.2e78f904.js.map +1 -0
  23. js/dist/parcel.js +2 -2
  24. js/dist/parcel.json +1 -1
  25. js/dist/parcel.urls +1 -1
  26. js/frontend.js +10 -87
  27. js/lib/html.js +44 -0
  28. js/lib/localStorageAccess.js +21 -0
  29. js/lib/xhr.js +56 -0
  30. js/lodash.custom.js +563 -2
  31. js/lodash.custom.min.js +14 -10
  32. js/lookup.js +125 -0
  33. js/lookup.test.js +61 -0
  34. js/models/record.js +66 -14
  35. js/models/record.test.js +35 -0
  36. js/shortcodes/helpers.js +36 -0
  37. js/shortcodes/index.js +26 -0
  38. js/shortcodes/normal.js +25 -0
  39. js/shortcodes/show-if.js +84 -0
  40. js/shortcodes/show-if.test.js +12 -0
  41. js/test-lib/test-records.js +116 -0
  42. lib/ccpa.php +3 -2
  43. lib/get-client-ip.php +1 -1
  44. lib/timezone.php +2241 -0
  45. package.json +11 -8
  46. readme.txt +43 -4
  47. shortcodes/_helpers.php +85 -0
  48. shortcodes/cf7.php +184 -0
  49. shortcodes/flags.php +102 -0
  50. shortcodes/input.php +80 -0
  51. shortcodes/main.php +121 -0
  52. shortcodes/other.php +74 -0
  53. shortcodes/select.php +142 -0
  54. shortcodes/show_if.php +265 -0
  55. upgrade-plugin.php +8 -0
  56. vendor/autoload.php +1 -1
  57. vendor/composer/autoload_classmap.php +129 -10
  58. vendor/composer/autoload_files.php +6 -1
  59. vendor/composer/autoload_psr4.php +7 -2
  60. vendor/composer/autoload_real.php +7 -7
  61. vendor/composer/autoload_static.php +170 -21
  62. vendor/composer/ca-bundle/composer.json +7 -7
  63. vendor/composer/ca-bundle/phpstan.neon.dist +5 -0
  64. vendor/composer/ca-bundle/res/cacert.pem +194 -235
  65. vendor/composer/ca-bundle/src/CaBundle.php +52 -9
  66. vendor/composer/installed.json +477 -126
  67. vendor/geoip2/geoip2/CHANGELOG.md +28 -0
  68. vendor/geoip2/geoip2/README.md +25 -17
  69. vendor/geoip2/geoip2/composer.json +6 -5
  70. vendor/geoip2/geoip2/src/Database/Reader.php +30 -40
  71. vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php +2 -0
  72. vendor/geoip2/geoip2/src/Exception/AuthenticationException.php +2 -0
  73. vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php +2 -0
  74. vendor/geoip2/geoip2/src/Exception/HttpException.php +5 -3
  75. vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php +6 -4
  76. vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php +2 -0
  77. vendor/geoip2/geoip2/src/Model/AbstractModel.php +7 -13
  78. vendor/geoip2/geoip2/src/Model/AnonymousIp.php +21 -7
  79. vendor/geoip2/geoip2/src/Model/Asn.php +12 -4
  80. vendor/geoip2/geoip2/src/Model/City.php +11 -33
  81. vendor/geoip2/geoip2/src/Model/ConnectionType.php +12 -4
  82. vendor/geoip2/geoip2/src/Model/Country.php +4 -5
  83. vendor/geoip2/geoip2/src/Model/Domain.php +12 -4
  84. vendor/geoip2/geoip2/src/Model/Enterprise.php +3 -34
  85. vendor/geoip2/geoip2/src/Model/Insights.php +3 -34
  86. vendor/geoip2/geoip2/src/Model/Isp.php +12 -4
  87. vendor/geoip2/geoip2/src/ProviderInterface.php +4 -2
  88. vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php +8 -13
  89. vendor/geoip2/geoip2/src/Record/AbstractRecord.php +9 -11
  90. vendor/geoip2/geoip2/src/Record/City.php +2 -0
  91. vendor/geoip2/geoip2/src/Record/Continent.php +2 -0
  92. vendor/geoip2/geoip2/src/Record/Country.php +5 -4
  93. vendor/geoip2/geoip2/src/Record/Location.php +6 -4
  94. vendor/geoip2/geoip2/src/Record/MaxMind.php +2 -0
  95. vendor/geoip2/geoip2/src/Record/Postal.php +2 -0
  96. vendor/geoip2/geoip2/src/Record/RepresentedCountry.php +2 -13
  97. vendor/geoip2/geoip2/src/Record/Subdivision.php +5 -3
  98. vendor/geoip2/geoip2/src/Record/Traits.php +49 -17
  99. vendor/geoip2/geoip2/src/Util.php +3 -4
  100. vendor/geoip2/geoip2/src/WebService/Client.php +15 -19
  101. vendor/maxmind-db/reader/CHANGELOG.md +56 -0
  102. vendor/maxmind-db/reader/README.md +12 -5
  103. vendor/maxmind-db/reader/autoload.php +7 -5
  104. vendor/maxmind-db/reader/composer.json +14 -5
  105. vendor/maxmind-db/reader/ext/config.w32 +10 -0
  106. vendor/maxmind-db/reader/ext/maxminddb.c +349 -240
  107. vendor/maxmind-db/reader/ext/php_maxminddb.h +1 -1
  108. vendor/maxmind-db/reader/package.xml +65 -0
  109. vendor/maxmind-db/reader/phpstan.neon +7 -0
  110. vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php +106 -61
  111. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php +117 -95
  112. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php +2 -0
  113. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php +86 -62
  114. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php +8 -2
  115. vendor/maxmind/web-service-common/CHANGELOG.md +27 -0
  116. vendor/maxmind/web-service-common/README.md +2 -3
  117. vendor/maxmind/web-service-common/composer.json +2 -2
  118. vendor/maxmind/web-service-common/dev-bin/release.sh +1 -1
  119. vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php +2 -0
  120. vendor/maxmind/web-service-common/src/Exception/HttpException.php +7 -5
  121. vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php +2 -0
  122. vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php +2 -0
  123. vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php +8 -6
  124. vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php +2 -0
  125. vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php +2 -0
  126. vendor/maxmind/web-service-common/src/Exception/WebServiceException.php +2 -0
  127. vendor/maxmind/web-service-common/src/WebService/Client.php +77 -59
  128. vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php +43 -17
  129. vendor/maxmind/web-service-common/src/WebService/Http/Request.php +5 -15
  130. vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php +28 -6
  131. vendor/symfony/deprecation-contracts/.gitignore +3 -0
  132. vendor/symfony/deprecation-contracts/CHANGELOG.md +5 -0
  133. vendor/symfony/deprecation-contracts/LICENSE +19 -0
  134. vendor/symfony/deprecation-contracts/README.md +26 -0
  135. vendor/symfony/deprecation-contracts/composer.json +35 -0
  136. vendor/symfony/deprecation-contracts/function.php +27 -0
  137. vendor/symfony/http-foundation/IpUtils.php +10 -13
  138. vendor/symfony/http-foundation/LICENSE +1 -1
  139. vendor/symfony/polyfill-ctype/bootstrap.php +4 -0
  140. vendor/symfony/polyfill-ctype/bootstrap80.php +46 -0
  141. vendor/symfony/polyfill-ctype/composer.json +2 -2
  142. vendor/symfony/polyfill-intl-grapheme/Grapheme.php +237 -0
  143. vendor/symfony/polyfill-intl-grapheme/LICENSE +19 -0
  144. vendor/symfony/polyfill-intl-grapheme/README.md +31 -0
  145. vendor/symfony/polyfill-intl-grapheme/bootstrap.php +58 -0
  146. vendor/symfony/polyfill-intl-grapheme/bootstrap80.php +52 -0
  147. vendor/symfony/polyfill-intl-grapheme/composer.json +38 -0
  148. vendor/symfony/polyfill-intl-normalizer/LICENSE +19 -0
  149. vendor/symfony/polyfill-intl-normalizer/Normalizer.php +310 -0
  150. vendor/symfony/polyfill-intl-normalizer/README.md +14 -0
  151. vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php +17 -0
  152. vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php +945 -0
  153. vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php +2065 -0
  154. vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php +876 -0
  155. vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php +3695 -0
  156. vendor/symfony/polyfill-intl-normalizer/bootstrap.php +23 -0
  157. vendor/symfony/polyfill-intl-normalizer/bootstrap80.php +19 -0
  158. vendor/symfony/polyfill-intl-normalizer/composer.json +39 -0
  159. vendor/symfony/polyfill-mbstring/LICENSE +19 -0
  160. vendor/symfony/polyfill-mbstring/Mbstring.php +869 -0
  161. vendor/symfony/polyfill-mbstring/README.md +13 -0
  162. vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -0
  163. vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -0
  164. vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +319 -0
CONTRIBUTING.md CHANGED
@@ -5,6 +5,7 @@ Depending on your skill and interests, here is what you can give:
5
  1. Code
6
  2. Documentation
7
  3. Support
 
8
  4. Translation
9
  5. Donation
10
 
@@ -24,25 +25,31 @@ You only need a Github user, navigate to the site and click on `Edit` in the Top
24
 
25
  The documentation of PHP function is copied out of the code. If you want to modify them, please (if you can) modify them in the code repository as well (and send a pull request).
26
 
27
- If you need inspiration of what needs better documenting, look at the [support forum](https://wordpress.org/support/plugin/geoip-detect/).
28
 
29
- ## 3. Support
30
 
31
- Go to the [support forum](https://wordpress.org/support/plugin/geoip-detect/) and check for unresolved (esp. un-replied) threads. If you can answer the question, please do so! I probably would have replied also at some point, but maybe only weeks later. The questions range from beginner to very-techical, so I'm sure if you are an active user of the plugin, some question can be replied by you.
 
 
 
 
 
 
32
 
33
  You can subscribe to the forum by clicking on the `Subscribe` button on the top - BTW I have subscribed to the forum so I will see all requests and your replies as well. So don't worry, if I don't agree with you for some reason I will explain why ;-)
34
 
35
- ## 4. Translation
36
 
37
  I am maintaining the German translation of the plugin. If you want to translate the plugin UI into your own mother-tongue, here is how you do it:
38
 
39
- * Read the [General expectations for translations](https://make.wordpress.org/polyglots/handbook/translating/expectations/)
40
  * Login with your wordpress user on the [wordpress platform](https://translate.wordpress.org/projects/wp-plugins/geoip-detect/)
41
  * "Suggest" translation strings for the whole plugin. Only translations that are completed can be considered to be published.
42
- * Then [submit a PTE request](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/pte-request/#sample-translation-reviewpte-request-by-a-plugintheme-author)
43
  * After each plugin update, there might be a few plugin strings changed. So from time to time, please check these "Fuzzy" or "Untranslated" strings
44
 
45
- ## 5. Donation
46
 
47
  This plugin is [charity-ware](https://github.com/yellowtree/geoip-detect/wiki/FAQ#what-do-you-mean-by-this-plugin-is-charity-ware):
48
 
5
  1. Code
6
  2. Documentation
7
  3. Support
8
+ 4. Beta-Testing
9
  4. Translation
10
  5. Donation
11
 
25
 
26
  The documentation of PHP function is copied out of the code. If you want to modify them, please (if you can) modify them in the code repository as well (and send a pull request).
27
 
28
+ If you need inspiration of what needs better documenting, look at the [support forum](https://wordpress.org/support/plugin/geoip-detect/). Hint: You can start with the things that you were stuck yourself when you started using the plugin, most probably others will learn from it.
29
 
30
+ ## 3. Beta-Testing
31
 
32
+ Beta for me means "I *think* I'm finished, but ..." - often some errors only appear in a certain environment, or I have forgotten to support some edge case / options combination.
33
+ So it would be great if you can install the beta version in your development and tell me if everything works, especially the features that have changed recently!
34
+ How? See [Beta Testing](https://github.com/yellowtree/geoip-detect/wiki/Beta_Testing)
35
+
36
+ ## 4. Support
37
+
38
+ Go to the [support forum](https://wordpress.org/support/plugin/geoip-detect/) and check for [unresolved (esp. un-replied)](https://wordpress.org/support/plugin/geoip-detect/unresolved/) threads. If you can answer the question, please do so! I probably would have replied also at some point, but maybe only weeks later. The questions range from beginner to very-techical, so I'm sure if you are an active user of the plugin, some question can be replied by you.
39
 
40
  You can subscribe to the forum by clicking on the `Subscribe` button on the top - BTW I have subscribed to the forum so I will see all requests and your replies as well. So don't worry, if I don't agree with you for some reason I will explain why ;-)
41
 
42
+ ## 5. Translation
43
 
44
  I am maintaining the German translation of the plugin. If you want to translate the plugin UI into your own mother-tongue, here is how you do it:
45
 
46
+ * Read the [General expectations for translations](https://make.wordpress.org/polyglots/handbook/translating/expectations/) first.
47
  * Login with your wordpress user on the [wordpress platform](https://translate.wordpress.org/projects/wp-plugins/geoip-detect/)
48
  * "Suggest" translation strings for the whole plugin. Only translations that are completed can be considered to be published.
49
+ * Then [submit a so-called PTE request](https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/pte-request/#sample-translation-reviewpte-request-by-a-plugintheme-author)
50
  * After each plugin update, there might be a few plugin strings changed. So from time to time, please check these "Fuzzy" or "Untranslated" strings
51
 
52
+ ## 6. Donation
53
 
54
  This plugin is [charity-ware](https://github.com/yellowtree/geoip-detect/wiki/FAQ#what-do-you-mean-by-this-plugin-is-charity-ware):
55
 
admin-ui.php CHANGED
@@ -62,6 +62,15 @@ function geoip_detect_lookup_page()
62
 
63
  if (geoip_detect_verify_nonce($action)) {
64
  switch($action) {
 
 
 
 
 
 
 
 
 
65
  case 'lookup':
66
  if ($ip)
67
  {
@@ -92,11 +101,11 @@ function geoip_detect_sanitize_option($opt_name, $opt_value, &$message = '') {
92
  case 'external_ip':
93
  if ($opt_value) {
94
  if (!geoip_detect_is_ip($opt_value)) {
95
- $message .= 'The external IP "' . esc_html($opt_value) . '" is not a valid IP.';
96
  return false;
97
  } else {
98
  if (!geoip_detect_is_public_ip($opt_value)) {
99
- $message .= 'Warning: The external IP "' . esc_html($opt_value) . '" is not a public internet IP, so it will probably not work.';
100
  }
101
  $opt_value = (string) $opt_value;
102
  }
62
 
63
  if (geoip_detect_verify_nonce($action)) {
64
  switch($action) {
65
+ case 'clear_cache':
66
+ $registry = DataSourceRegistry::getInstance();
67
+ $ret = $registry->clearCache();
68
+ if ($ret === true) {
69
+ $message = __('The cache has been emptied successfully.', 'geoip-detect');
70
+ } else {
71
+ $message = $ret;
72
+ }
73
+ break;
74
  case 'lookup':
75
  if ($ip)
76
  {
101
  case 'external_ip':
102
  if ($opt_value) {
103
  if (!geoip_detect_is_ip($opt_value)) {
104
+ $message .= sprintf(__('The external IP "%s" is not a valid IP.', 'geoip-detect'), esc_html($opt_value));
105
  return false;
106
  } else {
107
  if (!geoip_detect_is_public_ip($opt_value)) {
108
+ $message .= sprintf(__('Warning: The external IP "%s" is not a public internet IP, so it will probably not work.', 'geoip-detect'), esc_html($opt_value));
109
  }
110
  $opt_value = (string) $opt_value;
111
  }
ajax.php CHANGED
@@ -66,11 +66,7 @@ function geoip_detect_ajax_get_info_from_current_ip() {
66
 
67
  $data = apply_filters('geoip_detect2_ajax_record_data', $data, isset($data['traits']['ip_address']) ? $data['traits']['ip_address'] : '' ) ;
68
 
69
- if ($data['extra']['error'])
70
- http_response_code(500);
71
-
72
- echo json_encode($data);
73
- exit;
74
  }
75
 
76
  add_action( 'wp_ajax_geoip_detect2_get_info_from_current_ip', 'geoip_detect_ajax_get_info_from_current_ip' );
@@ -83,13 +79,9 @@ function _geoip_detect_get_domain_name($url) {
83
  }
84
 
85
  function _geoip_detect_ajax_error($error) {
86
- http_response_code(412);
87
-
88
  $data = array('extra' => array('error' => $error));
89
  $data['is_empty'] = true;
90
- echo json_encode($data);
91
-
92
- exit;
93
  }
94
 
95
 
@@ -118,6 +110,7 @@ function _geoip_detect2_enqueue_javascript() {
118
  wp_enqueue_script('geoip-detect-js');
119
  });
120
  }
 
121
  }
122
 
123
  function _geoip_detect_parcel_get_dist_js($handle) {
@@ -157,14 +150,14 @@ function _geoip_detect_register_javascript() {
157
  'default_locales' => apply_filters('geoip_detect2_locales', null),
158
  'do_body_classes' => (bool) get_option('geoip-detect-ajax_set_css_country'),
159
  'do_shortcodes' => (bool) get_option('geoip-detect-ajax_shortcodes'),
160
- 'cookie_name' => 'geoip-detect-result', /* If you don't want to use the cookie cache, empty this value via the filter */
161
  'cookie_duration_in_days' => 1, /* If you set this to 0, then the cookie will expire when the window closes. */
162
  ];
163
  $data = apply_filters('geoip_detect2_ajax_localize_script_data', $data);
164
  wp_localize_script('geoip-detect-js', 'geoip_detect', [ 'options' => $data ] );
165
 
166
  if (get_option('geoip-detect-ajax_enqueue_js') && !is_admin()) {
167
- geoip_detect2_enqueue_javascript();
168
  }
169
  }
170
 
66
 
67
  $data = apply_filters('geoip_detect2_ajax_record_data', $data, isset($data['traits']['ip_address']) ? $data['traits']['ip_address'] : '' ) ;
68
 
69
+ wp_send_json($data, !empty($data['extra']['error']) ? 500 : 200 );
 
 
 
 
70
  }
71
 
72
  add_action( 'wp_ajax_geoip_detect2_get_info_from_current_ip', 'geoip_detect_ajax_get_info_from_current_ip' );
79
  }
80
 
81
  function _geoip_detect_ajax_error($error) {
 
 
82
  $data = array('extra' => array('error' => $error));
83
  $data['is_empty'] = true;
84
+ wp_send_json($data, 412);
 
 
85
  }
86
 
87
 
110
  wp_enqueue_script('geoip-detect-js');
111
  });
112
  }
113
+ return true;
114
  }
115
 
116
  function _geoip_detect_parcel_get_dist_js($handle) {
150
  'default_locales' => apply_filters('geoip_detect2_locales', null),
151
  'do_body_classes' => (bool) get_option('geoip-detect-ajax_set_css_country'),
152
  'do_shortcodes' => (bool) get_option('geoip-detect-ajax_shortcodes'),
153
+ 'cookie_name' => 'geoip-detect-result', /* If you don't want to use the cookie cache (localstorage), empty this value via the filter */
154
  'cookie_duration_in_days' => 1, /* If you set this to 0, then the cookie will expire when the window closes. */
155
  ];
156
  $data = apply_filters('geoip_detect2_ajax_localize_script_data', $data);
157
  wp_localize_script('geoip-detect-js', 'geoip_detect', [ 'options' => $data ] );
158
 
159
  if (get_option('geoip-detect-ajax_enqueue_js') && !is_admin()) {
160
+ geoip_detect2_enqueue_javascript('option');
161
  }
162
  }
163
 
api.php CHANGED
@@ -41,10 +41,14 @@ use YellowTree\GeoipDetect\Lib\GetClientIp;
41
  * @since 2.5.0 Parameter $skipCache has been renamed to $options with 'skipCache' property
42
  * @since 2.7.0 Parameter $options['source'] has been introduced
43
  */
44
- function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()) {
 
 
 
 
 
45
  _geoip_maybe_disable_pagecache();
46
  // 1) Processing the parameters.
47
-
48
  $options = _geoip_detect2_process_options($options);
49
 
50
  /**
@@ -102,7 +106,7 @@ function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()
102
  // 3) Returning the data
103
 
104
  // Always return a city record for API compatability. City attributes etc. return empty values.
105
- $record = new \YellowTree\GeoipDetect\DataSources\City($data, $locales);
106
 
107
  /**
108
  * Filter: geoip_detect2_record_information
@@ -110,7 +114,14 @@ function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()
110
  *
111
  * @return \YellowTree\GeoipDetect\DataSources\City
112
  */
113
- $record = apply_filters('geoip_detect2_record_information', $record, $ip, $locales);
 
 
 
 
 
 
 
114
 
115
  return $record;
116
  }
@@ -192,7 +203,7 @@ function geoip_detect2_get_current_source_description($source = null) {
192
  *
193
  * @since 2.0.0
194
  */
195
- function geoip_detect2_get_client_ip() {
196
  _geoip_maybe_disable_pagecache();
197
 
198
  static $helper = null;
@@ -217,7 +228,7 @@ function geoip_detect2_get_client_ip() {
217
  * @since 2.4.3 Reading option 'external_ip' first.
218
  * @since 2.5.2 New param $unfiltered that can bypass the option.
219
  */
220
- function geoip_detect2_get_external_ip_adress($unfiltered = false) {
221
  $ip_cache = '';
222
 
223
  if (!$unfiltered)
@@ -245,7 +256,14 @@ function geoip_detect2_get_external_ip_adress($unfiltered = false) {
245
  * Call this function if you want to register the JS script for AJAX mode only for specific pages.
246
  * Can be called via the shortcode `[geoip_detect2_enqueue_javascript]`
247
  * @see https://github.com/yellowtree/geoip-detect/wiki/API-Usage-Examples#ajax-enqueue-the-js-file-manually
 
248
  */
249
- function geoip_detect2_enqueue_javascript() {
250
- _geoip_detect2_enqueue_javascript();
 
 
 
 
 
 
251
  }
41
  * @since 2.5.0 Parameter $skipCache has been renamed to $options with 'skipCache' property
42
  * @since 2.7.0 Parameter $options['source'] has been introduced
43
  */
44
+ function geoip_detect2_get_info_from_ip(string $ip, $locales = null, $options = array()) : \YellowTree\GeoipDetect\DataSources\City {
45
+ if(defined('GEOIP_DETECT_LOOKUP_DISABLED') && GEOIP_DETECT_LOOKUP_DISABLED) {
46
+ trigger_error('Geolocation IP Detection: The lookup is currently disabled.');
47
+ return _geoip_detect2_get_new_empty_record();
48
+ }
49
+
50
  _geoip_maybe_disable_pagecache();
51
  // 1) Processing the parameters.
 
52
  $options = _geoip_detect2_process_options($options);
53
 
54
  /**
106
  // 3) Returning the data
107
 
108
  // Always return a city record for API compatability. City attributes etc. return empty values.
109
+ $original_record = new \YellowTree\GeoipDetect\DataSources\City($data, $locales);
110
 
111
  /**
112
  * Filter: geoip_detect2_record_information
114
  *
115
  * @return \YellowTree\GeoipDetect\DataSources\City
116
  */
117
+ $record = apply_filters('geoip_detect2_record_information', $original_record, $ip, $locales);
118
+ if (! ($record instanceof \YellowTree\GeoipDetect\DataSources\City) ) {
119
+ if (method_exists($record, 'jsonSerialize')) {
120
+ $data = $record->jsonSerialize();
121
+ return new \YellowTree\GeoipDetect\DataSources\City($data, $locales);
122
+ }
123
+ return $original_record;
124
+ }
125
 
126
  return $record;
127
  }
203
  *
204
  * @since 2.0.0
205
  */
206
+ function geoip_detect2_get_client_ip() : string {
207
  _geoip_maybe_disable_pagecache();
208
 
209
  static $helper = null;
228
  * @since 2.4.3 Reading option 'external_ip' first.
229
  * @since 2.5.2 New param $unfiltered that can bypass the option.
230
  */
231
+ function geoip_detect2_get_external_ip_adress(bool $unfiltered = false) : string {
232
  $ip_cache = '';
233
 
234
  if (!$unfiltered)
256
  * Call this function if you want to register the JS script for AJAX mode only for specific pages.
257
  * Can be called via the shortcode `[geoip_detect2_enqueue_javascript]`
258
  * @see https://github.com/yellowtree/geoip-detect/wiki/API-Usage-Examples#ajax-enqueue-the-js-file-manually
259
+ * @return bool was enqueued
260
  */
261
+ function geoip_detect2_enqueue_javascript(string $reason = 'user') : bool {
262
+ $do_it = apply_filters('geoip_detect_enqueue_javascript', true, $reason);
263
+ $do_it = apply_filters('geoip_detect_enqueue_javascript_' . $reason, $do_it);
264
+
265
+ if ($do_it) {
266
+ _geoip_detect2_enqueue_javascript();
267
+ }
268
+ return $do_it;
269
  }
api_shortcodes.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ // API: The wordpress shortcodes are considered official API, the function names are not.
22
+
23
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/_helpers.php');
24
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/main.php');
25
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/cf7.php');
26
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/show_if.php');
27
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/other.php');
28
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/select.php');
29
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/input.php');
30
+ require_once(GEOIP_PLUGIN_DIR . '/shortcodes/flags.php');
31
+
32
+
33
+
34
+
35
+
check_requirements.php CHANGED
@@ -30,13 +30,13 @@ function geoip_detect_version_check() {
30
  $min = GEOIP_REQUIRED_PHP_VERSION;
31
  $yours = PHP_VERSION;
32
 
33
- $message = 'Plugin Geolocation IP Detection is disabled. Requires ' . $flag . ' ' .$min ." (you're using " . $flag . " " . $yours . ") ";
34
  } elseif (version_compare ( $wp_version, GEOIP_REQUIRED_WP_VERSION, '<' )) {
35
  $flag = 'WordPress';
36
  $min = GEOIP_REQUIRED_WP_VERSION;
37
  $yours = $wp_version;
38
 
39
- $message = 'Plugin Geolocation IP Detection is disabled. Requires ' . $flag . ' ' .$min ." (you're using " . $flag . " " . $yours . ") ";
40
  } else {
41
  return true;
42
  }
@@ -58,10 +58,47 @@ function geoip_detect_version_minimum_requirements_notice() {
58
  <div class="error">
59
  <h3><?php _e( 'Geolocation IP Detection: Minimum requirements not met.', 'geoip-detect' ); ?></h3>
60
  <p>
61
- The plugin <strong>Geolocation IP Detection</strong> plugin requires PHP <?php echo GEOIP_REQUIRED_PHP_VERSION; ?> (you're using PHP <?php echo PHP_VERSION; ?>) and WordPress version <?php echo GEOIP_REQUIRED_WP_VERSION; ?> (you're using: <?php echo $wp_version; ?>) and therefore does exactly nothing.</p>
 
62
  <p>
63
  You can update, or install an <a href="https://github.com/yellowtree/wp-geoip-detect/releases">1.x legacy version</a> of this plugin instead.
64
  </p>
65
  </div>
66
  <?php
67
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  $min = GEOIP_REQUIRED_PHP_VERSION;
31
  $yours = PHP_VERSION;
32
 
33
+ $message = 'Plugin Geolocation IP Detection is disabled, because it requires at least ' . $flag . ' ' .$min ." (you're using " . $flag . " " . $yours . ") ";
34
  } elseif (version_compare ( $wp_version, GEOIP_REQUIRED_WP_VERSION, '<' )) {
35
  $flag = 'WordPress';
36
  $min = GEOIP_REQUIRED_WP_VERSION;
37
  $yours = $wp_version;
38
 
39
+ $message = 'Plugin Geolocation IP Detection is disabled, because it requires at least ' . $flag . ' ' .$min ." (you're using " . $flag . " " . $yours . ") ";
40
  } else {
41
  return true;
42
  }
58
  <div class="error">
59
  <h3><?php _e( 'Geolocation IP Detection: Minimum requirements not met.', 'geoip-detect' ); ?></h3>
60
  <p>
61
+ The plugin <strong>Geolocation IP Detection</strong> plugin requires PHP <?php echo GEOIP_REQUIRED_PHP_VERSION; ?> (you're using PHP <?php echo PHP_VERSION; ?>) and WordPress version <?php echo GEOIP_REQUIRED_WP_VERSION; ?> (you're using: <?php echo $wp_version; ?>) and therefore does exactly nothing.
62
+ </p>
63
  <p>
64
  You can update, or install an <a href="https://github.com/yellowtree/wp-geoip-detect/releases">1.x legacy version</a> of this plugin instead.
65
  </p>
66
  </div>
67
  <?php
68
  }
69
+
70
+
71
+ function geoip_detect_version_check_after_plugins_loaded() {
72
+ if(defined('WOOCOMMERCE_VERSION') && version_compare(WOOCOMMERCE_VERSION, GEOIP_REQUIRED_WOOCOMMERCE_VERSION, '<')) {
73
+ $flag = 'WooCommerce';
74
+ $min = GEOIP_REQUIRED_WOOCOMMERCE_VERSION;
75
+ $yours = WOOCOMMERCE_VERSION;
76
+ $message = 'Plugin Geolocation IP Detection is disabled, because it requires at least ' . $flag . ' ' .$min ." (you're using " . $flag . " " . $yours . ") ";
77
+ } else {
78
+ return true;
79
+ }
80
+
81
+ if (WP_DEBUG)
82
+ trigger_error($message);
83
+
84
+ add_action ( 'all_admin_notices', 'geoip_detect_version_minimum_requirements_notice_woocommerce' );
85
+
86
+ return false;
87
+ }
88
+
89
+
90
+
91
+
92
+ function geoip_detect_version_minimum_requirements_notice_woocommerce() {
93
+ ?>
94
+ <div class="error">
95
+ <h3><?php _e( 'Geolocation IP Detection: Minimum requirements not met.', 'geoip-detect' ); ?></h3>
96
+ <p>
97
+ The plugin <strong>Geolocation IP Detection</strong> plugin requires WooCommerce <?php echo GEOIP_REQUIRED_WOOCOMMERCE_VERSION; ?> (you're using WooCommerce <?php echo WOOCOMMERCE_VERSION; ?>) and therefore cannot lookup IP information.
98
+ </p>
99
+ <p>
100
+ You can a) update the WooCommerce plugin, b) disable it, or c) downgrade the Geolocation IP Detection plugin to 3.x .
101
+ </p>
102
+ </div>
103
+ <?php
104
+ }
composer.json CHANGED
@@ -10,11 +10,20 @@
10
  "keywords": [],
11
  "homepage": "http://www.yellowtree.de",
12
  "license": [
13
- "GPL-3.0+"
14
  ],
15
  "require": {
 
16
  "geoip2/geoip2": "~2.0",
17
- "php": ">=5.6",
18
- "symfony/property-access": "^3.4"
 
 
 
 
 
 
 
 
19
  }
20
  }
10
  "keywords": [],
11
  "homepage": "http://www.yellowtree.de",
12
  "license": [
13
+ "GPL-3.0-or-later"
14
  ],
15
  "require": {
16
+ "php": ">=7.2.5",
17
  "geoip2/geoip2": "~2.0",
18
+ "symfony/property-access": "^5.2",
19
+ "symfony/http-foundation": "^5.2"
20
+ },
21
+ "require-dev": {
22
+ "phpunit/phpunit": "^7.5",
23
+ "roots/wordpress": "5.6",
24
+ "wp-phpunit/wp-phpunit": "5.6"
25
+ },
26
+ "scripts": {
27
+ "test": "phpunit"
28
  }
29
  }
composer.lock CHANGED
@@ -4,20 +4,20 @@
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
- "content-hash": "5c667020928ed82b17b5c3bbbf6a3c8f",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
11
- "version": "1.2.4",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/composer/ca-bundle.git",
15
- "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527"
16
  },
17
  "dist": {
18
  "type": "zip",
19
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527",
20
- "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527",
21
  "shasum": ""
22
  },
23
  "require": {
@@ -26,14 +26,15 @@
26
  "php": "^5.3.2 || ^7.0 || ^8.0"
27
  },
28
  "require-dev": {
29
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
30
  "psr/log": "^1.0",
31
- "symfony/process": "^2.5 || ^3.0 || ^4.0"
 
32
  },
33
  "type": "library",
34
  "extra": {
35
  "branch-alias": {
36
- "dev-master": "1.x-dev"
37
  }
38
  },
39
  "autoload": {
@@ -60,30 +61,31 @@
60
  "ssl",
61
  "tls"
62
  ],
63
- "time": "2019-08-30T08:44:50+00:00"
64
  },
65
  {
66
  "name": "geoip2/geoip2",
67
- "version": "v2.9.0",
68
  "source": {
69
  "type": "git",
70
  "url": "https://github.com/maxmind/GeoIP2-php.git",
71
- "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77"
72
  },
73
  "dist": {
74
  "type": "zip",
75
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/a807fbf65212eef5d8d2db1a1b31082b53633d77",
76
- "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77",
77
  "shasum": ""
78
  },
79
  "require": {
80
- "maxmind-db/reader": "~1.0",
81
- "maxmind/web-service-common": "~0.5",
82
- "php": ">=5.4"
 
83
  },
84
  "require-dev": {
85
  "friendsofphp/php-cs-fixer": "2.*",
86
- "phpunit/phpunit": "4.*",
87
  "squizlabs/php_codesniffer": "3.*"
88
  },
89
  "type": "library",
@@ -100,7 +102,7 @@
100
  {
101
  "name": "Gregory J. Oschwald",
102
  "email": "goschwald@maxmind.com",
103
- "homepage": "http://www.maxmind.com/"
104
  }
105
  ],
106
  "description": "MaxMind GeoIP2 PHP API",
@@ -112,30 +114,34 @@
112
  "geolocation",
113
  "maxmind"
114
  ],
115
- "time": "2018-04-10T15:32:59+00:00"
116
  },
117
  {
118
  "name": "maxmind-db/reader",
119
- "version": "v1.5.0",
120
  "source": {
121
  "type": "git",
122
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
123
- "reference": "bd436094fc0a9b0558a899fb80b0ae34fe1808a0"
124
  },
125
  "dist": {
126
  "type": "zip",
127
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/bd436094fc0a9b0558a899fb80b0ae34fe1808a0",
128
- "reference": "bd436094fc0a9b0558a899fb80b0ae34fe1808a0",
129
  "shasum": ""
130
  },
131
  "require": {
132
- "php": ">=5.6"
 
 
 
133
  },
134
  "require-dev": {
135
- "friendsofphp/php-cs-fixer": "2.*",
136
  "php-coveralls/php-coveralls": "^2.1",
137
- "phpunit/phpcov": "^3.0",
138
- "phpunit/phpunit": "5.*",
 
139
  "squizlabs/php_codesniffer": "3.*"
140
  },
141
  "suggest": {
@@ -169,31 +175,31 @@
169
  "geolocation",
170
  "maxmind"
171
  ],
172
- "time": "2019-09-30T22:56:38+00:00"
173
  },
174
  {
175
  "name": "maxmind/web-service-common",
176
- "version": "v0.5.0",
177
  "source": {
178
  "type": "git",
179
  "url": "https://github.com/maxmind/web-service-common-php.git",
180
- "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b"
181
  },
182
  "dist": {
183
  "type": "zip",
184
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/61a9836fa3bb1743ab89752bae5005d71e78c73b",
185
- "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b",
186
  "shasum": ""
187
  },
188
  "require": {
189
  "composer/ca-bundle": "^1.0.3",
190
  "ext-curl": "*",
191
  "ext-json": "*",
192
- "php": ">=5.4"
193
  },
194
  "require-dev": {
195
  "friendsofphp/php-cs-fixer": "2.*",
196
- "phpunit/phpunit": "4.*",
197
  "squizlabs/php_codesniffer": "3.*"
198
  },
199
  "type": "library",
@@ -215,83 +221,212 @@
215
  ],
216
  "description": "Internal MaxMind Web Service API",
217
  "homepage": "https://github.com/maxmind/web-service-common-php",
218
- "time": "2018-02-12T22:31:54+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  },
220
  {
221
- "name": "paragonie/random_compat",
222
- "version": "v9.99.99",
223
  "source": {
224
  "type": "git",
225
- "url": "https://github.com/paragonie/random_compat.git",
226
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
227
  },
228
  "dist": {
229
  "type": "zip",
230
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
231
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
232
  "shasum": ""
233
  },
234
  "require": {
235
- "php": "^7"
 
 
 
236
  },
237
  "require-dev": {
238
- "phpunit/phpunit": "4.*|5.*",
239
- "vimeo/psalm": "^1"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  },
241
  "suggest": {
242
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
243
  },
244
  "type": "library",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  "notification-url": "https://packagist.org/downloads/",
246
  "license": [
247
  "MIT"
248
  ],
249
  "authors": [
250
  {
251
- "name": "Paragon Initiative Enterprises",
252
- "email": "security@paragonie.com",
253
- "homepage": "https://paragonie.com"
 
 
 
254
  }
255
  ],
256
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
 
257
  "keywords": [
258
- "csprng",
 
259
  "polyfill",
260
- "pseudorandom",
261
- "random"
262
  ],
263
- "time": "2018-07-02T15:55:56+00:00"
264
  },
265
  {
266
- "name": "symfony/inflector",
267
- "version": "v4.4.10",
268
  "source": {
269
  "type": "git",
270
- "url": "https://github.com/symfony/inflector.git",
271
- "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7"
272
  },
273
  "dist": {
274
  "type": "zip",
275
- "url": "https://api.github.com/repos/symfony/inflector/zipball/3330be44724db42f0aa493002ae63f5d29f8d5f7",
276
- "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7",
277
  "shasum": ""
278
  },
279
  "require": {
280
- "php": ">=7.1.3",
281
- "symfony/polyfill-ctype": "~1.8"
 
 
282
  },
283
  "type": "library",
284
  "extra": {
285
  "branch-alias": {
286
- "dev-master": "4.4-dev"
 
 
 
 
287
  }
288
  },
289
  "autoload": {
290
  "psr-4": {
291
- "Symfony\\Component\\Inflector\\": ""
292
  },
293
- "exclude-from-classmap": [
294
- "/Tests/"
295
  ]
296
  },
297
  "notification-url": "https://packagist.org/downloads/",
@@ -300,50 +435,50 @@
300
  ],
301
  "authors": [
302
  {
303
- "name": "Bernhard Schussek",
304
- "email": "bschussek@gmail.com"
305
  },
306
  {
307
  "name": "Symfony Community",
308
  "homepage": "https://symfony.com/contributors"
309
  }
310
  ],
311
- "description": "Symfony Inflector Component",
312
  "homepage": "https://symfony.com",
313
  "keywords": [
314
- "inflection",
315
- "pluralize",
316
- "singularize",
317
- "string",
318
- "symfony",
319
- "words"
320
  ],
321
- "time": "2020-05-20T08:37:50+00:00"
322
  },
323
  {
324
- "name": "symfony/polyfill-ctype",
325
- "version": "v1.17.1",
326
  "source": {
327
  "type": "git",
328
- "url": "https://github.com/symfony/polyfill-ctype.git",
329
- "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d"
330
  },
331
  "dist": {
332
  "type": "zip",
333
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
334
- "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
335
  "shasum": ""
336
  },
337
  "require": {
338
- "php": ">=5.3.3"
339
  },
340
  "suggest": {
341
- "ext-ctype": "For best performance"
342
  },
343
  "type": "library",
344
  "extra": {
345
  "branch-alias": {
346
- "dev-master": "1.17-dev"
347
  },
348
  "thanks": {
349
  "name": "symfony/polyfill",
@@ -352,10 +487,13 @@
352
  },
353
  "autoload": {
354
  "psr-4": {
355
- "Symfony\\Polyfill\\Ctype\\": ""
356
  },
357
  "files": [
358
  "bootstrap.php"
 
 
 
359
  ]
360
  },
361
  "notification-url": "https://packagist.org/downloads/",
@@ -364,46 +502,110 @@
364
  ],
365
  "authors": [
366
  {
367
- "name": "Gert de Pagter",
368
- "email": "BackEndTea@gmail.com"
369
  },
370
  {
371
  "name": "Symfony Community",
372
  "homepage": "https://symfony.com/contributors"
373
  }
374
  ],
375
- "description": "Symfony polyfill for ctype functions",
376
  "homepage": "https://symfony.com",
377
  "keywords": [
378
  "compatibility",
379
- "ctype",
 
380
  "polyfill",
381
- "portable"
 
382
  ],
383
- "time": "2020-06-06T08:46:27+00:00"
384
  },
385
  {
386
- "name": "symfony/polyfill-php70",
387
- "version": "v1.17.1",
388
  "source": {
389
  "type": "git",
390
- "url": "https://github.com/symfony/polyfill-php70.git",
391
- "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d"
392
  },
393
  "dist": {
394
  "type": "zip",
395
- "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/471b096aede7025bace8eb356b9ac801aaba7e2d",
396
- "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d",
397
  "shasum": ""
398
  },
399
  "require": {
400
- "paragonie/random_compat": "~1.0|~2.0|~9.99",
401
- "php": ">=5.3.3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
402
  },
403
  "type": "library",
404
  "extra": {
405
  "branch-alias": {
406
- "dev-master": "1.17-dev"
407
  },
408
  "thanks": {
409
  "name": "symfony/polyfill",
@@ -412,7 +614,7 @@
412
  },
413
  "autoload": {
414
  "psr-4": {
415
- "Symfony\\Polyfill\\Php70\\": ""
416
  },
417
  "files": [
418
  "bootstrap.php"
@@ -426,6 +628,10 @@
426
  "MIT"
427
  ],
428
  "authors": [
 
 
 
 
429
  {
430
  "name": "Nicolas Grekas",
431
  "email": "p@tchwork.com"
@@ -435,7 +641,7 @@
435
  "homepage": "https://symfony.com/contributors"
436
  }
437
  ],
438
- "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
439
  "homepage": "https://symfony.com",
440
  "keywords": [
441
  "compatibility",
@@ -443,39 +649,35 @@
443
  "portable",
444
  "shim"
445
  ],
446
- "time": "2020-06-06T08:46:27+00:00"
447
  },
448
  {
449
  "name": "symfony/property-access",
450
- "version": "v3.4.42",
451
  "source": {
452
  "type": "git",
453
  "url": "https://github.com/symfony/property-access.git",
454
- "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85"
455
  },
456
  "dist": {
457
  "type": "zip",
458
- "url": "https://api.github.com/repos/symfony/property-access/zipball/e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
459
- "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
460
  "shasum": ""
461
  },
462
  "require": {
463
- "php": "^5.5.9|>=7.0.8",
464
- "symfony/inflector": "~3.1|~4.0",
465
- "symfony/polyfill-php70": "~1.0"
 
466
  },
467
  "require-dev": {
468
- "symfony/cache": "~3.1|~4.0"
469
  },
470
  "suggest": {
471
  "psr/cache-implementation": "To cache access methods."
472
  },
473
  "type": "library",
474
- "extra": {
475
- "branch-alias": {
476
- "dev-master": "3.4-dev"
477
- }
478
- },
479
  "autoload": {
480
  "psr-4": {
481
  "Symfony\\Component\\PropertyAccess\\": ""
@@ -498,7 +700,7 @@
498
  "homepage": "https://symfony.com/contributors"
499
  }
500
  ],
501
- "description": "Symfony PropertyAccess Component",
502
  "homepage": "https://symfony.com",
503
  "keywords": [
504
  "access",
@@ -511,17 +713,1695 @@
511
  "property path",
512
  "reflection"
513
  ],
514
- "time": "2020-05-29T00:04:36+00:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
  }
516
  ],
517
- "packages-dev": [],
518
  "aliases": [],
519
  "minimum-stability": "stable",
520
  "stability-flags": [],
521
  "prefer-stable": false,
522
  "prefer-lowest": false,
523
  "platform": {
524
- "php": ">=5.6"
525
  },
526
  "platform-dev": []
527
  }
4
  "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
  "This file is @generated automatically"
6
  ],
7
+ "content-hash": "ee6848d44267b81644fd364617a57d54",
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
11
+ "version": "1.2.9",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/composer/ca-bundle.git",
15
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5"
16
  },
17
  "dist": {
18
  "type": "zip",
19
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
20
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
21
  "shasum": ""
22
  },
23
  "require": {
26
  "php": "^5.3.2 || ^7.0 || ^8.0"
27
  },
28
  "require-dev": {
29
+ "phpstan/phpstan": "^0.12.55",
30
  "psr/log": "^1.0",
31
+ "symfony/phpunit-bridge": "^4.2 || ^5",
32
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
33
  },
34
  "type": "library",
35
  "extra": {
36
  "branch-alias": {
37
+ "dev-main": "1.x-dev"
38
  }
39
  },
40
  "autoload": {
61
  "ssl",
62
  "tls"
63
  ],
64
+ "time": "2021-01-12T12:10:35+00:00"
65
  },
66
  {
67
  "name": "geoip2/geoip2",
68
+ "version": "v2.11.0",
69
  "source": {
70
  "type": "git",
71
  "url": "https://github.com/maxmind/GeoIP2-php.git",
72
+ "reference": "d01be5894a5c1a3381c58c9b1795cd07f96c30f7"
73
  },
74
  "dist": {
75
  "type": "zip",
76
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/d01be5894a5c1a3381c58c9b1795cd07f96c30f7",
77
+ "reference": "d01be5894a5c1a3381c58c9b1795cd07f96c30f7",
78
  "shasum": ""
79
  },
80
  "require": {
81
+ "ext-json": "*",
82
+ "maxmind-db/reader": "~1.8",
83
+ "maxmind/web-service-common": "~0.8",
84
+ "php": ">=7.2"
85
  },
86
  "require-dev": {
87
  "friendsofphp/php-cs-fixer": "2.*",
88
+ "phpunit/phpunit": "^8.0 || ^9.0",
89
  "squizlabs/php_codesniffer": "3.*"
90
  },
91
  "type": "library",
102
  {
103
  "name": "Gregory J. Oschwald",
104
  "email": "goschwald@maxmind.com",
105
+ "homepage": "https://www.maxmind.com/"
106
  }
107
  ],
108
  "description": "MaxMind GeoIP2 PHP API",
114
  "geolocation",
115
  "maxmind"
116
  ],
117
+ "time": "2020-10-01T18:48:34+00:00"
118
  },
119
  {
120
  "name": "maxmind-db/reader",
121
+ "version": "v1.10.0",
122
  "source": {
123
  "type": "git",
124
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
125
+ "reference": "07f84d969cfc527ce49388558a366ad376f1f35c"
126
  },
127
  "dist": {
128
  "type": "zip",
129
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c",
130
+ "reference": "07f84d969cfc527ce49388558a366ad376f1f35c",
131
  "shasum": ""
132
  },
133
  "require": {
134
+ "php": ">=7.2"
135
+ },
136
+ "conflict": {
137
+ "ext-maxminddb": "<1.10.0,>=2.0.0"
138
  },
139
  "require-dev": {
140
+ "friendsofphp/php-cs-fixer": "*",
141
  "php-coveralls/php-coveralls": "^2.1",
142
+ "phpstan/phpstan": "*",
143
+ "phpunit/phpcov": ">=6.0.0",
144
+ "phpunit/phpunit": ">=8.0.0,<10.0.0",
145
  "squizlabs/php_codesniffer": "3.*"
146
  },
147
  "suggest": {
175
  "geolocation",
176
  "maxmind"
177
  ],
178
+ "time": "2021-02-09T17:52:47+00:00"
179
  },
180
  {
181
  "name": "maxmind/web-service-common",
182
+ "version": "v0.8.1",
183
  "source": {
184
  "type": "git",
185
  "url": "https://github.com/maxmind/web-service-common-php.git",
186
+ "reference": "32f274051c543fc865e5a84d3a2c703913641ea8"
187
  },
188
  "dist": {
189
  "type": "zip",
190
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/32f274051c543fc865e5a84d3a2c703913641ea8",
191
+ "reference": "32f274051c543fc865e5a84d3a2c703913641ea8",
192
  "shasum": ""
193
  },
194
  "require": {
195
  "composer/ca-bundle": "^1.0.3",
196
  "ext-curl": "*",
197
  "ext-json": "*",
198
+ "php": ">=7.2"
199
  },
200
  "require-dev": {
201
  "friendsofphp/php-cs-fixer": "2.*",
202
+ "phpunit/phpunit": "^8.0 || ^9.0",
203
  "squizlabs/php_codesniffer": "3.*"
204
  },
205
  "type": "library",
221
  ],
222
  "description": "Internal MaxMind Web Service API",
223
  "homepage": "https://github.com/maxmind/web-service-common-php",
224
+ "time": "2020-11-02T17:00:53+00:00"
225
+ },
226
+ {
227
+ "name": "symfony/deprecation-contracts",
228
+ "version": "v2.2.0",
229
+ "source": {
230
+ "type": "git",
231
+ "url": "https://github.com/symfony/deprecation-contracts.git",
232
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
233
+ },
234
+ "dist": {
235
+ "type": "zip",
236
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
237
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
238
+ "shasum": ""
239
+ },
240
+ "require": {
241
+ "php": ">=7.1"
242
+ },
243
+ "type": "library",
244
+ "extra": {
245
+ "branch-alias": {
246
+ "dev-master": "2.2-dev"
247
+ },
248
+ "thanks": {
249
+ "name": "symfony/contracts",
250
+ "url": "https://github.com/symfony/contracts"
251
+ }
252
+ },
253
+ "autoload": {
254
+ "files": [
255
+ "function.php"
256
+ ]
257
+ },
258
+ "notification-url": "https://packagist.org/downloads/",
259
+ "license": [
260
+ "MIT"
261
+ ],
262
+ "authors": [
263
+ {
264
+ "name": "Nicolas Grekas",
265
+ "email": "p@tchwork.com"
266
+ },
267
+ {
268
+ "name": "Symfony Community",
269
+ "homepage": "https://symfony.com/contributors"
270
+ }
271
+ ],
272
+ "description": "A generic function and convention to trigger deprecation notices",
273
+ "homepage": "https://symfony.com",
274
+ "time": "2020-09-07T11:33:47+00:00"
275
  },
276
  {
277
+ "name": "symfony/http-foundation",
278
+ "version": "v5.2.3",
279
  "source": {
280
  "type": "git",
281
+ "url": "https://github.com/symfony/http-foundation.git",
282
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36"
283
  },
284
  "dist": {
285
  "type": "zip",
286
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36",
287
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36",
288
  "shasum": ""
289
  },
290
  "require": {
291
+ "php": ">=7.2.5",
292
+ "symfony/deprecation-contracts": "^2.1",
293
+ "symfony/polyfill-mbstring": "~1.1",
294
+ "symfony/polyfill-php80": "^1.15"
295
  },
296
  "require-dev": {
297
+ "predis/predis": "~1.0",
298
+ "symfony/cache": "^4.4|^5.0",
299
+ "symfony/expression-language": "^4.4|^5.0",
300
+ "symfony/mime": "^4.4|^5.0"
301
+ },
302
+ "suggest": {
303
+ "symfony/mime": "To use the file extension guesser"
304
+ },
305
+ "type": "library",
306
+ "autoload": {
307
+ "psr-4": {
308
+ "Symfony\\Component\\HttpFoundation\\": ""
309
+ },
310
+ "exclude-from-classmap": [
311
+ "/Tests/"
312
+ ]
313
+ },
314
+ "notification-url": "https://packagist.org/downloads/",
315
+ "license": [
316
+ "MIT"
317
+ ],
318
+ "authors": [
319
+ {
320
+ "name": "Fabien Potencier",
321
+ "email": "fabien@symfony.com"
322
+ },
323
+ {
324
+ "name": "Symfony Community",
325
+ "homepage": "https://symfony.com/contributors"
326
+ }
327
+ ],
328
+ "description": "Defines an object-oriented layer for the HTTP specification",
329
+ "homepage": "https://symfony.com",
330
+ "time": "2021-02-03T04:42:09+00:00"
331
+ },
332
+ {
333
+ "name": "symfony/polyfill-ctype",
334
+ "version": "v1.22.1",
335
+ "source": {
336
+ "type": "git",
337
+ "url": "https://github.com/symfony/polyfill-ctype.git",
338
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
339
+ },
340
+ "dist": {
341
+ "type": "zip",
342
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
343
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
344
+ "shasum": ""
345
+ },
346
+ "require": {
347
+ "php": ">=7.1"
348
  },
349
  "suggest": {
350
+ "ext-ctype": "For best performance"
351
  },
352
  "type": "library",
353
+ "extra": {
354
+ "branch-alias": {
355
+ "dev-main": "1.22-dev"
356
+ },
357
+ "thanks": {
358
+ "name": "symfony/polyfill",
359
+ "url": "https://github.com/symfony/polyfill"
360
+ }
361
+ },
362
+ "autoload": {
363
+ "psr-4": {
364
+ "Symfony\\Polyfill\\Ctype\\": ""
365
+ },
366
+ "files": [
367
+ "bootstrap.php"
368
+ ]
369
+ },
370
  "notification-url": "https://packagist.org/downloads/",
371
  "license": [
372
  "MIT"
373
  ],
374
  "authors": [
375
  {
376
+ "name": "Gert de Pagter",
377
+ "email": "BackEndTea@gmail.com"
378
+ },
379
+ {
380
+ "name": "Symfony Community",
381
+ "homepage": "https://symfony.com/contributors"
382
  }
383
  ],
384
+ "description": "Symfony polyfill for ctype functions",
385
+ "homepage": "https://symfony.com",
386
  "keywords": [
387
+ "compatibility",
388
+ "ctype",
389
  "polyfill",
390
+ "portable"
 
391
  ],
392
+ "time": "2021-01-07T16:49:33+00:00"
393
  },
394
  {
395
+ "name": "symfony/polyfill-intl-grapheme",
396
+ "version": "v1.22.1",
397
  "source": {
398
  "type": "git",
399
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
400
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
401
  },
402
  "dist": {
403
  "type": "zip",
404
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
405
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
406
  "shasum": ""
407
  },
408
  "require": {
409
+ "php": ">=7.1"
410
+ },
411
+ "suggest": {
412
+ "ext-intl": "For best performance"
413
  },
414
  "type": "library",
415
  "extra": {
416
  "branch-alias": {
417
+ "dev-main": "1.22-dev"
418
+ },
419
+ "thanks": {
420
+ "name": "symfony/polyfill",
421
+ "url": "https://github.com/symfony/polyfill"
422
  }
423
  },
424
  "autoload": {
425
  "psr-4": {
426
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
427
  },
428
+ "files": [
429
+ "bootstrap.php"
430
  ]
431
  },
432
  "notification-url": "https://packagist.org/downloads/",
435
  ],
436
  "authors": [
437
  {
438
+ "name": "Nicolas Grekas",
439
+ "email": "p@tchwork.com"
440
  },
441
  {
442
  "name": "Symfony Community",
443
  "homepage": "https://symfony.com/contributors"
444
  }
445
  ],
446
+ "description": "Symfony polyfill for intl's grapheme_* functions",
447
  "homepage": "https://symfony.com",
448
  "keywords": [
449
+ "compatibility",
450
+ "grapheme",
451
+ "intl",
452
+ "polyfill",
453
+ "portable",
454
+ "shim"
455
  ],
456
+ "time": "2021-01-22T09:19:47+00:00"
457
  },
458
  {
459
+ "name": "symfony/polyfill-intl-normalizer",
460
+ "version": "v1.22.1",
461
  "source": {
462
  "type": "git",
463
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
464
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
465
  },
466
  "dist": {
467
  "type": "zip",
468
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
469
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
470
  "shasum": ""
471
  },
472
  "require": {
473
+ "php": ">=7.1"
474
  },
475
  "suggest": {
476
+ "ext-intl": "For best performance"
477
  },
478
  "type": "library",
479
  "extra": {
480
  "branch-alias": {
481
+ "dev-main": "1.22-dev"
482
  },
483
  "thanks": {
484
  "name": "symfony/polyfill",
487
  },
488
  "autoload": {
489
  "psr-4": {
490
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
491
  },
492
  "files": [
493
  "bootstrap.php"
494
+ ],
495
+ "classmap": [
496
+ "Resources/stubs"
497
  ]
498
  },
499
  "notification-url": "https://packagist.org/downloads/",
502
  ],
503
  "authors": [
504
  {
505
+ "name": "Nicolas Grekas",
506
+ "email": "p@tchwork.com"
507
  },
508
  {
509
  "name": "Symfony Community",
510
  "homepage": "https://symfony.com/contributors"
511
  }
512
  ],
513
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
514
  "homepage": "https://symfony.com",
515
  "keywords": [
516
  "compatibility",
517
+ "intl",
518
+ "normalizer",
519
  "polyfill",
520
+ "portable",
521
+ "shim"
522
  ],
523
+ "time": "2021-01-22T09:19:47+00:00"
524
  },
525
  {
526
+ "name": "symfony/polyfill-mbstring",
527
+ "version": "v1.22.1",
528
  "source": {
529
  "type": "git",
530
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
531
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
532
  },
533
  "dist": {
534
  "type": "zip",
535
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
536
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
537
  "shasum": ""
538
  },
539
  "require": {
540
+ "php": ">=7.1"
541
+ },
542
+ "suggest": {
543
+ "ext-mbstring": "For best performance"
544
+ },
545
+ "type": "library",
546
+ "extra": {
547
+ "branch-alias": {
548
+ "dev-main": "1.22-dev"
549
+ },
550
+ "thanks": {
551
+ "name": "symfony/polyfill",
552
+ "url": "https://github.com/symfony/polyfill"
553
+ }
554
+ },
555
+ "autoload": {
556
+ "psr-4": {
557
+ "Symfony\\Polyfill\\Mbstring\\": ""
558
+ },
559
+ "files": [
560
+ "bootstrap.php"
561
+ ]
562
+ },
563
+ "notification-url": "https://packagist.org/downloads/",
564
+ "license": [
565
+ "MIT"
566
+ ],
567
+ "authors": [
568
+ {
569
+ "name": "Nicolas Grekas",
570
+ "email": "p@tchwork.com"
571
+ },
572
+ {
573
+ "name": "Symfony Community",
574
+ "homepage": "https://symfony.com/contributors"
575
+ }
576
+ ],
577
+ "description": "Symfony polyfill for the Mbstring extension",
578
+ "homepage": "https://symfony.com",
579
+ "keywords": [
580
+ "compatibility",
581
+ "mbstring",
582
+ "polyfill",
583
+ "portable",
584
+ "shim"
585
+ ],
586
+ "time": "2021-01-22T09:19:47+00:00"
587
+ },
588
+ {
589
+ "name": "symfony/polyfill-php80",
590
+ "version": "v1.22.1",
591
+ "source": {
592
+ "type": "git",
593
+ "url": "https://github.com/symfony/polyfill-php80.git",
594
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
595
+ },
596
+ "dist": {
597
+ "type": "zip",
598
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
599
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
600
+ "shasum": ""
601
+ },
602
+ "require": {
603
+ "php": ">=7.1"
604
  },
605
  "type": "library",
606
  "extra": {
607
  "branch-alias": {
608
+ "dev-main": "1.22-dev"
609
  },
610
  "thanks": {
611
  "name": "symfony/polyfill",
614
  },
615
  "autoload": {
616
  "psr-4": {
617
+ "Symfony\\Polyfill\\Php80\\": ""
618
  },
619
  "files": [
620
  "bootstrap.php"
628
  "MIT"
629
  ],
630
  "authors": [
631
+ {
632
+ "name": "Ion Bazan",
633
+ "email": "ion.bazan@gmail.com"
634
+ },
635
  {
636
  "name": "Nicolas Grekas",
637
  "email": "p@tchwork.com"
641
  "homepage": "https://symfony.com/contributors"
642
  }
643
  ],
644
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
645
  "homepage": "https://symfony.com",
646
  "keywords": [
647
  "compatibility",
649
  "portable",
650
  "shim"
651
  ],
652
+ "time": "2021-01-07T16:49:33+00:00"
653
  },
654
  {
655
  "name": "symfony/property-access",
656
+ "version": "v5.2.3",
657
  "source": {
658
  "type": "git",
659
  "url": "https://github.com/symfony/property-access.git",
660
+ "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3"
661
  },
662
  "dist": {
663
  "type": "zip",
664
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3",
665
+ "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3",
666
  "shasum": ""
667
  },
668
  "require": {
669
+ "php": ">=7.2.5",
670
+ "symfony/deprecation-contracts": "^2.1",
671
+ "symfony/polyfill-php80": "^1.15",
672
+ "symfony/property-info": "^5.2"
673
  },
674
  "require-dev": {
675
+ "symfony/cache": "^4.4|^5.0"
676
  },
677
  "suggest": {
678
  "psr/cache-implementation": "To cache access methods."
679
  },
680
  "type": "library",
 
 
 
 
 
681
  "autoload": {
682
  "psr-4": {
683
  "Symfony\\Component\\PropertyAccess\\": ""
700
  "homepage": "https://symfony.com/contributors"
701
  }
702
  ],
703
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
704
  "homepage": "https://symfony.com",
705
  "keywords": [
706
  "access",
713
  "property path",
714
  "reflection"
715
  ],
716
+ "time": "2021-01-27T10:15:41+00:00"
717
+ },
718
+ {
719
+ "name": "symfony/property-info",
720
+ "version": "v5.2.3",
721
+ "source": {
722
+ "type": "git",
723
+ "url": "https://github.com/symfony/property-info.git",
724
+ "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77"
725
+ },
726
+ "dist": {
727
+ "type": "zip",
728
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
729
+ "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
730
+ "shasum": ""
731
+ },
732
+ "require": {
733
+ "php": ">=7.2.5",
734
+ "symfony/deprecation-contracts": "^2.1",
735
+ "symfony/polyfill-php80": "^1.15",
736
+ "symfony/string": "^5.1"
737
+ },
738
+ "conflict": {
739
+ "phpdocumentor/reflection-docblock": "<3.2.2",
740
+ "phpdocumentor/type-resolver": "<1.4.0",
741
+ "symfony/dependency-injection": "<4.4"
742
+ },
743
+ "require-dev": {
744
+ "doctrine/annotations": "^1.10.4",
745
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
746
+ "symfony/cache": "^4.4|^5.0",
747
+ "symfony/dependency-injection": "^4.4|^5.0",
748
+ "symfony/serializer": "^4.4|^5.0"
749
+ },
750
+ "suggest": {
751
+ "phpdocumentor/reflection-docblock": "To use the PHPDoc",
752
+ "psr/cache-implementation": "To cache results",
753
+ "symfony/doctrine-bridge": "To use Doctrine metadata",
754
+ "symfony/serializer": "To use Serializer metadata"
755
+ },
756
+ "type": "library",
757
+ "autoload": {
758
+ "psr-4": {
759
+ "Symfony\\Component\\PropertyInfo\\": ""
760
+ },
761
+ "exclude-from-classmap": [
762
+ "/Tests/"
763
+ ]
764
+ },
765
+ "notification-url": "https://packagist.org/downloads/",
766
+ "license": [
767
+ "MIT"
768
+ ],
769
+ "authors": [
770
+ {
771
+ "name": "Kévin Dunglas",
772
+ "email": "dunglas@gmail.com"
773
+ },
774
+ {
775
+ "name": "Symfony Community",
776
+ "homepage": "https://symfony.com/contributors"
777
+ }
778
+ ],
779
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
780
+ "homepage": "https://symfony.com",
781
+ "keywords": [
782
+ "doctrine",
783
+ "phpdoc",
784
+ "property",
785
+ "symfony",
786
+ "type",
787
+ "validator"
788
+ ],
789
+ "time": "2021-01-27T10:15:41+00:00"
790
+ },
791
+ {
792
+ "name": "symfony/string",
793
+ "version": "v5.2.3",
794
+ "source": {
795
+ "type": "git",
796
+ "url": "https://github.com/symfony/string.git",
797
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122"
798
+ },
799
+ "dist": {
800
+ "type": "zip",
801
+ "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
802
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122",
803
+ "shasum": ""
804
+ },
805
+ "require": {
806
+ "php": ">=7.2.5",
807
+ "symfony/polyfill-ctype": "~1.8",
808
+ "symfony/polyfill-intl-grapheme": "~1.0",
809
+ "symfony/polyfill-intl-normalizer": "~1.0",
810
+ "symfony/polyfill-mbstring": "~1.0",
811
+ "symfony/polyfill-php80": "~1.15"
812
+ },
813
+ "require-dev": {
814
+ "symfony/error-handler": "^4.4|^5.0",
815
+ "symfony/http-client": "^4.4|^5.0",
816
+ "symfony/translation-contracts": "^1.1|^2",
817
+ "symfony/var-exporter": "^4.4|^5.0"
818
+ },
819
+ "type": "library",
820
+ "autoload": {
821
+ "psr-4": {
822
+ "Symfony\\Component\\String\\": ""
823
+ },
824
+ "files": [
825
+ "Resources/functions.php"
826
+ ],
827
+ "exclude-from-classmap": [
828
+ "/Tests/"
829
+ ]
830
+ },
831
+ "notification-url": "https://packagist.org/downloads/",
832
+ "license": [
833
+ "MIT"
834
+ ],
835
+ "authors": [
836
+ {
837
+ "name": "Nicolas Grekas",
838
+ "email": "p@tchwork.com"
839
+ },
840
+ {
841
+ "name": "Symfony Community",
842
+ "homepage": "https://symfony.com/contributors"
843
+ }
844
+ ],
845
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
846
+ "homepage": "https://symfony.com",
847
+ "keywords": [
848
+ "grapheme",
849
+ "i18n",
850
+ "string",
851
+ "unicode",
852
+ "utf-8",
853
+ "utf8"
854
+ ],
855
+ "time": "2021-01-25T15:14:59+00:00"
856
+ }
857
+ ],
858
+ "packages-dev": [
859
+ {
860
+ "name": "doctrine/instantiator",
861
+ "version": "1.4.0",
862
+ "source": {
863
+ "type": "git",
864
+ "url": "https://github.com/doctrine/instantiator.git",
865
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
866
+ },
867
+ "dist": {
868
+ "type": "zip",
869
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
870
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
871
+ "shasum": ""
872
+ },
873
+ "require": {
874
+ "php": "^7.1 || ^8.0"
875
+ },
876
+ "require-dev": {
877
+ "doctrine/coding-standard": "^8.0",
878
+ "ext-pdo": "*",
879
+ "ext-phar": "*",
880
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
881
+ "phpstan/phpstan": "^0.12",
882
+ "phpstan/phpstan-phpunit": "^0.12",
883
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
884
+ },
885
+ "type": "library",
886
+ "autoload": {
887
+ "psr-4": {
888
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
889
+ }
890
+ },
891
+ "notification-url": "https://packagist.org/downloads/",
892
+ "license": [
893
+ "MIT"
894
+ ],
895
+ "authors": [
896
+ {
897
+ "name": "Marco Pivetta",
898
+ "email": "ocramius@gmail.com",
899
+ "homepage": "https://ocramius.github.io/"
900
+ }
901
+ ],
902
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
903
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
904
+ "keywords": [
905
+ "constructor",
906
+ "instantiate"
907
+ ],
908
+ "time": "2020-11-10T18:47:58+00:00"
909
+ },
910
+ {
911
+ "name": "myclabs/deep-copy",
912
+ "version": "1.10.2",
913
+ "source": {
914
+ "type": "git",
915
+ "url": "https://github.com/myclabs/DeepCopy.git",
916
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
917
+ },
918
+ "dist": {
919
+ "type": "zip",
920
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
921
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
922
+ "shasum": ""
923
+ },
924
+ "require": {
925
+ "php": "^7.1 || ^8.0"
926
+ },
927
+ "replace": {
928
+ "myclabs/deep-copy": "self.version"
929
+ },
930
+ "require-dev": {
931
+ "doctrine/collections": "^1.0",
932
+ "doctrine/common": "^2.6",
933
+ "phpunit/phpunit": "^7.1"
934
+ },
935
+ "type": "library",
936
+ "autoload": {
937
+ "psr-4": {
938
+ "DeepCopy\\": "src/DeepCopy/"
939
+ },
940
+ "files": [
941
+ "src/DeepCopy/deep_copy.php"
942
+ ]
943
+ },
944
+ "notification-url": "https://packagist.org/downloads/",
945
+ "license": [
946
+ "MIT"
947
+ ],
948
+ "description": "Create deep copies (clones) of your objects",
949
+ "keywords": [
950
+ "clone",
951
+ "copy",
952
+ "duplicate",
953
+ "object",
954
+ "object graph"
955
+ ],
956
+ "time": "2020-11-13T09:40:50+00:00"
957
+ },
958
+ {
959
+ "name": "phar-io/manifest",
960
+ "version": "1.0.3",
961
+ "source": {
962
+ "type": "git",
963
+ "url": "https://github.com/phar-io/manifest.git",
964
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
965
+ },
966
+ "dist": {
967
+ "type": "zip",
968
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
969
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
970
+ "shasum": ""
971
+ },
972
+ "require": {
973
+ "ext-dom": "*",
974
+ "ext-phar": "*",
975
+ "phar-io/version": "^2.0",
976
+ "php": "^5.6 || ^7.0"
977
+ },
978
+ "type": "library",
979
+ "extra": {
980
+ "branch-alias": {
981
+ "dev-master": "1.0.x-dev"
982
+ }
983
+ },
984
+ "autoload": {
985
+ "classmap": [
986
+ "src/"
987
+ ]
988
+ },
989
+ "notification-url": "https://packagist.org/downloads/",
990
+ "license": [
991
+ "BSD-3-Clause"
992
+ ],
993
+ "authors": [
994
+ {
995
+ "name": "Arne Blankerts",
996
+ "email": "arne@blankerts.de",
997
+ "role": "Developer"
998
+ },
999
+ {
1000
+ "name": "Sebastian Heuer",
1001
+ "email": "sebastian@phpeople.de",
1002
+ "role": "Developer"
1003
+ },
1004
+ {
1005
+ "name": "Sebastian Bergmann",
1006
+ "email": "sebastian@phpunit.de",
1007
+ "role": "Developer"
1008
+ }
1009
+ ],
1010
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
1011
+ "time": "2018-07-08T19:23:20+00:00"
1012
+ },
1013
+ {
1014
+ "name": "phar-io/version",
1015
+ "version": "2.0.1",
1016
+ "source": {
1017
+ "type": "git",
1018
+ "url": "https://github.com/phar-io/version.git",
1019
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
1020
+ },
1021
+ "dist": {
1022
+ "type": "zip",
1023
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
1024
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
1025
+ "shasum": ""
1026
+ },
1027
+ "require": {
1028
+ "php": "^5.6 || ^7.0"
1029
+ },
1030
+ "type": "library",
1031
+ "autoload": {
1032
+ "classmap": [
1033
+ "src/"
1034
+ ]
1035
+ },
1036
+ "notification-url": "https://packagist.org/downloads/",
1037
+ "license": [
1038
+ "BSD-3-Clause"
1039
+ ],
1040
+ "authors": [
1041
+ {
1042
+ "name": "Arne Blankerts",
1043
+ "email": "arne@blankerts.de",
1044
+ "role": "Developer"
1045
+ },
1046
+ {
1047
+ "name": "Sebastian Heuer",
1048
+ "email": "sebastian@phpeople.de",
1049
+ "role": "Developer"
1050
+ },
1051
+ {
1052
+ "name": "Sebastian Bergmann",
1053
+ "email": "sebastian@phpunit.de",
1054
+ "role": "Developer"
1055
+ }
1056
+ ],
1057
+ "description": "Library for handling version information and constraints",
1058
+ "time": "2018-07-08T19:19:57+00:00"
1059
+ },
1060
+ {
1061
+ "name": "phpdocumentor/reflection-common",
1062
+ "version": "2.2.0",
1063
+ "source": {
1064
+ "type": "git",
1065
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
1066
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
1067
+ },
1068
+ "dist": {
1069
+ "type": "zip",
1070
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1071
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1072
+ "shasum": ""
1073
+ },
1074
+ "require": {
1075
+ "php": "^7.2 || ^8.0"
1076
+ },
1077
+ "type": "library",
1078
+ "extra": {
1079
+ "branch-alias": {
1080
+ "dev-2.x": "2.x-dev"
1081
+ }
1082
+ },
1083
+ "autoload": {
1084
+ "psr-4": {
1085
+ "phpDocumentor\\Reflection\\": "src/"
1086
+ }
1087
+ },
1088
+ "notification-url": "https://packagist.org/downloads/",
1089
+ "license": [
1090
+ "MIT"
1091
+ ],
1092
+ "authors": [
1093
+ {
1094
+ "name": "Jaap van Otterdijk",
1095
+ "email": "opensource@ijaap.nl"
1096
+ }
1097
+ ],
1098
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
1099
+ "homepage": "http://www.phpdoc.org",
1100
+ "keywords": [
1101
+ "FQSEN",
1102
+ "phpDocumentor",
1103
+ "phpdoc",
1104
+ "reflection",
1105
+ "static analysis"
1106
+ ],
1107
+ "time": "2020-06-27T09:03:43+00:00"
1108
+ },
1109
+ {
1110
+ "name": "phpdocumentor/reflection-docblock",
1111
+ "version": "5.2.2",
1112
+ "source": {
1113
+ "type": "git",
1114
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
1115
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
1116
+ },
1117
+ "dist": {
1118
+ "type": "zip",
1119
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
1120
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
1121
+ "shasum": ""
1122
+ },
1123
+ "require": {
1124
+ "ext-filter": "*",
1125
+ "php": "^7.2 || ^8.0",
1126
+ "phpdocumentor/reflection-common": "^2.2",
1127
+ "phpdocumentor/type-resolver": "^1.3",
1128
+ "webmozart/assert": "^1.9.1"
1129
+ },
1130
+ "require-dev": {
1131
+ "mockery/mockery": "~1.3.2"
1132
+ },
1133
+ "type": "library",
1134
+ "extra": {
1135
+ "branch-alias": {
1136
+ "dev-master": "5.x-dev"
1137
+ }
1138
+ },
1139
+ "autoload": {
1140
+ "psr-4": {
1141
+ "phpDocumentor\\Reflection\\": "src"
1142
+ }
1143
+ },
1144
+ "notification-url": "https://packagist.org/downloads/",
1145
+ "license": [
1146
+ "MIT"
1147
+ ],
1148
+ "authors": [
1149
+ {
1150
+ "name": "Mike van Riel",
1151
+ "email": "me@mikevanriel.com"
1152
+ },
1153
+ {
1154
+ "name": "Jaap van Otterdijk",
1155
+ "email": "account@ijaap.nl"
1156
+ }
1157
+ ],
1158
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
1159
+ "time": "2020-09-03T19:13:55+00:00"
1160
+ },
1161
+ {
1162
+ "name": "phpdocumentor/type-resolver",
1163
+ "version": "1.4.0",
1164
+ "source": {
1165
+ "type": "git",
1166
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
1167
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
1168
+ },
1169
+ "dist": {
1170
+ "type": "zip",
1171
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
1172
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
1173
+ "shasum": ""
1174
+ },
1175
+ "require": {
1176
+ "php": "^7.2 || ^8.0",
1177
+ "phpdocumentor/reflection-common": "^2.0"
1178
+ },
1179
+ "require-dev": {
1180
+ "ext-tokenizer": "*"
1181
+ },
1182
+ "type": "library",
1183
+ "extra": {
1184
+ "branch-alias": {
1185
+ "dev-1.x": "1.x-dev"
1186
+ }
1187
+ },
1188
+ "autoload": {
1189
+ "psr-4": {
1190
+ "phpDocumentor\\Reflection\\": "src"
1191
+ }
1192
+ },
1193
+ "notification-url": "https://packagist.org/downloads/",
1194
+ "license": [
1195
+ "MIT"
1196
+ ],
1197
+ "authors": [
1198
+ {
1199
+ "name": "Mike van Riel",
1200
+ "email": "me@mikevanriel.com"
1201
+ }
1202
+ ],
1203
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
1204
+ "time": "2020-09-17T18:55:26+00:00"
1205
+ },
1206
+ {
1207
+ "name": "phpspec/prophecy",
1208
+ "version": "1.12.2",
1209
+ "source": {
1210
+ "type": "git",
1211
+ "url": "https://github.com/phpspec/prophecy.git",
1212
+ "reference": "245710e971a030f42e08f4912863805570f23d39"
1213
+ },
1214
+ "dist": {
1215
+ "type": "zip",
1216
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39",
1217
+ "reference": "245710e971a030f42e08f4912863805570f23d39",
1218
+ "shasum": ""
1219
+ },
1220
+ "require": {
1221
+ "doctrine/instantiator": "^1.2",
1222
+ "php": "^7.2 || ~8.0, <8.1",
1223
+ "phpdocumentor/reflection-docblock": "^5.2",
1224
+ "sebastian/comparator": "^3.0 || ^4.0",
1225
+ "sebastian/recursion-context": "^3.0 || ^4.0"
1226
+ },
1227
+ "require-dev": {
1228
+ "phpspec/phpspec": "^6.0",
1229
+ "phpunit/phpunit": "^8.0 || ^9.0"
1230
+ },
1231
+ "type": "library",
1232
+ "extra": {
1233
+ "branch-alias": {
1234
+ "dev-master": "1.11.x-dev"
1235
+ }
1236
+ },
1237
+ "autoload": {
1238
+ "psr-4": {
1239
+ "Prophecy\\": "src/Prophecy"
1240
+ }
1241
+ },
1242
+ "notification-url": "https://packagist.org/downloads/",
1243
+ "license": [
1244
+ "MIT"
1245
+ ],
1246
+ "authors": [
1247
+ {
1248
+ "name": "Konstantin Kudryashov",
1249
+ "email": "ever.zet@gmail.com",
1250
+ "homepage": "http://everzet.com"
1251
+ },
1252
+ {
1253
+ "name": "Marcello Duarte",
1254
+ "email": "marcello.duarte@gmail.com"
1255
+ }
1256
+ ],
1257
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
1258
+ "homepage": "https://github.com/phpspec/prophecy",
1259
+ "keywords": [
1260
+ "Double",
1261
+ "Dummy",
1262
+ "fake",
1263
+ "mock",
1264
+ "spy",
1265
+ "stub"
1266
+ ],
1267
+ "time": "2020-12-19T10:15:11+00:00"
1268
+ },
1269
+ {
1270
+ "name": "phpunit/php-code-coverage",
1271
+ "version": "6.1.4",
1272
+ "source": {
1273
+ "type": "git",
1274
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1275
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d"
1276
+ },
1277
+ "dist": {
1278
+ "type": "zip",
1279
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
1280
+ "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d",
1281
+ "shasum": ""
1282
+ },
1283
+ "require": {
1284
+ "ext-dom": "*",
1285
+ "ext-xmlwriter": "*",
1286
+ "php": "^7.1",
1287
+ "phpunit/php-file-iterator": "^2.0",
1288
+ "phpunit/php-text-template": "^1.2.1",
1289
+ "phpunit/php-token-stream": "^3.0",
1290
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
1291
+ "sebastian/environment": "^3.1 || ^4.0",
1292
+ "sebastian/version": "^2.0.1",
1293
+ "theseer/tokenizer": "^1.1"
1294
+ },
1295
+ "require-dev": {
1296
+ "phpunit/phpunit": "^7.0"
1297
+ },
1298
+ "suggest": {
1299
+ "ext-xdebug": "^2.6.0"
1300
+ },
1301
+ "type": "library",
1302
+ "extra": {
1303
+ "branch-alias": {
1304
+ "dev-master": "6.1-dev"
1305
+ }
1306
+ },
1307
+ "autoload": {
1308
+ "classmap": [
1309
+ "src/"
1310
+ ]
1311
+ },
1312
+ "notification-url": "https://packagist.org/downloads/",
1313
+ "license": [
1314
+ "BSD-3-Clause"
1315
+ ],
1316
+ "authors": [
1317
+ {
1318
+ "name": "Sebastian Bergmann",
1319
+ "email": "sebastian@phpunit.de",
1320
+ "role": "lead"
1321
+ }
1322
+ ],
1323
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
1324
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
1325
+ "keywords": [
1326
+ "coverage",
1327
+ "testing",
1328
+ "xunit"
1329
+ ],
1330
+ "time": "2018-10-31T16:06:48+00:00"
1331
+ },
1332
+ {
1333
+ "name": "phpunit/php-file-iterator",
1334
+ "version": "2.0.3",
1335
+ "source": {
1336
+ "type": "git",
1337
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
1338
+ "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357"
1339
+ },
1340
+ "dist": {
1341
+ "type": "zip",
1342
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357",
1343
+ "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357",
1344
+ "shasum": ""
1345
+ },
1346
+ "require": {
1347
+ "php": ">=7.1"
1348
+ },
1349
+ "require-dev": {
1350
+ "phpunit/phpunit": "^8.5"
1351
+ },
1352
+ "type": "library",
1353
+ "extra": {
1354
+ "branch-alias": {
1355
+ "dev-master": "2.0.x-dev"
1356
+ }
1357
+ },
1358
+ "autoload": {
1359
+ "classmap": [
1360
+ "src/"
1361
+ ]
1362
+ },
1363
+ "notification-url": "https://packagist.org/downloads/",
1364
+ "license": [
1365
+ "BSD-3-Clause"
1366
+ ],
1367
+ "authors": [
1368
+ {
1369
+ "name": "Sebastian Bergmann",
1370
+ "email": "sebastian@phpunit.de",
1371
+ "role": "lead"
1372
+ }
1373
+ ],
1374
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
1375
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
1376
+ "keywords": [
1377
+ "filesystem",
1378
+ "iterator"
1379
+ ],
1380
+ "time": "2020-11-30T08:25:21+00:00"
1381
+ },
1382
+ {
1383
+ "name": "phpunit/php-text-template",
1384
+ "version": "1.2.1",
1385
+ "source": {
1386
+ "type": "git",
1387
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
1388
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
1389
+ },
1390
+ "dist": {
1391
+ "type": "zip",
1392
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1393
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1394
+ "shasum": ""
1395
+ },
1396
+ "require": {
1397
+ "php": ">=5.3.3"
1398
+ },
1399
+ "type": "library",
1400
+ "autoload": {
1401
+ "classmap": [
1402
+ "src/"
1403
+ ]
1404
+ },
1405
+ "notification-url": "https://packagist.org/downloads/",
1406
+ "license": [
1407
+ "BSD-3-Clause"
1408
+ ],
1409
+ "authors": [
1410
+ {
1411
+ "name": "Sebastian Bergmann",
1412
+ "email": "sebastian@phpunit.de",
1413
+ "role": "lead"
1414
+ }
1415
+ ],
1416
+ "description": "Simple template engine.",
1417
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1418
+ "keywords": [
1419
+ "template"
1420
+ ],
1421
+ "time": "2015-06-21T13:50:34+00:00"
1422
+ },
1423
+ {
1424
+ "name": "phpunit/php-timer",
1425
+ "version": "2.1.3",
1426
+ "source": {
1427
+ "type": "git",
1428
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
1429
+ "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662"
1430
+ },
1431
+ "dist": {
1432
+ "type": "zip",
1433
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662",
1434
+ "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662",
1435
+ "shasum": ""
1436
+ },
1437
+ "require": {
1438
+ "php": ">=7.1"
1439
+ },
1440
+ "require-dev": {
1441
+ "phpunit/phpunit": "^8.5"
1442
+ },
1443
+ "type": "library",
1444
+ "extra": {
1445
+ "branch-alias": {
1446
+ "dev-master": "2.1-dev"
1447
+ }
1448
+ },
1449
+ "autoload": {
1450
+ "classmap": [
1451
+ "src/"
1452
+ ]
1453
+ },
1454
+ "notification-url": "https://packagist.org/downloads/",
1455
+ "license": [
1456
+ "BSD-3-Clause"
1457
+ ],
1458
+ "authors": [
1459
+ {
1460
+ "name": "Sebastian Bergmann",
1461
+ "email": "sebastian@phpunit.de",
1462
+ "role": "lead"
1463
+ }
1464
+ ],
1465
+ "description": "Utility class for timing",
1466
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
1467
+ "keywords": [
1468
+ "timer"
1469
+ ],
1470
+ "time": "2020-11-30T08:20:02+00:00"
1471
+ },
1472
+ {
1473
+ "name": "phpunit/php-token-stream",
1474
+ "version": "3.1.2",
1475
+ "source": {
1476
+ "type": "git",
1477
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
1478
+ "reference": "472b687829041c24b25f475e14c2f38a09edf1c2"
1479
+ },
1480
+ "dist": {
1481
+ "type": "zip",
1482
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/472b687829041c24b25f475e14c2f38a09edf1c2",
1483
+ "reference": "472b687829041c24b25f475e14c2f38a09edf1c2",
1484
+ "shasum": ""
1485
+ },
1486
+ "require": {
1487
+ "ext-tokenizer": "*",
1488
+ "php": ">=7.1"
1489
+ },
1490
+ "require-dev": {
1491
+ "phpunit/phpunit": "^7.0"
1492
+ },
1493
+ "type": "library",
1494
+ "extra": {
1495
+ "branch-alias": {
1496
+ "dev-master": "3.1-dev"
1497
+ }
1498
+ },
1499
+ "autoload": {
1500
+ "classmap": [
1501
+ "src/"
1502
+ ]
1503
+ },
1504
+ "notification-url": "https://packagist.org/downloads/",
1505
+ "license": [
1506
+ "BSD-3-Clause"
1507
+ ],
1508
+ "authors": [
1509
+ {
1510
+ "name": "Sebastian Bergmann",
1511
+ "email": "sebastian@phpunit.de"
1512
+ }
1513
+ ],
1514
+ "description": "Wrapper around PHP's tokenizer extension.",
1515
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
1516
+ "keywords": [
1517
+ "tokenizer"
1518
+ ],
1519
+ "abandoned": true,
1520
+ "time": "2020-11-30T08:38:46+00:00"
1521
+ },
1522
+ {
1523
+ "name": "phpunit/phpunit",
1524
+ "version": "7.5.20",
1525
+ "source": {
1526
+ "type": "git",
1527
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
1528
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c"
1529
+ },
1530
+ "dist": {
1531
+ "type": "zip",
1532
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c",
1533
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c",
1534
+ "shasum": ""
1535
+ },
1536
+ "require": {
1537
+ "doctrine/instantiator": "^1.1",
1538
+ "ext-dom": "*",
1539
+ "ext-json": "*",
1540
+ "ext-libxml": "*",
1541
+ "ext-mbstring": "*",
1542
+ "ext-xml": "*",
1543
+ "myclabs/deep-copy": "^1.7",
1544
+ "phar-io/manifest": "^1.0.2",
1545
+ "phar-io/version": "^2.0",
1546
+ "php": "^7.1",
1547
+ "phpspec/prophecy": "^1.7",
1548
+ "phpunit/php-code-coverage": "^6.0.7",
1549
+ "phpunit/php-file-iterator": "^2.0.1",
1550
+ "phpunit/php-text-template": "^1.2.1",
1551
+ "phpunit/php-timer": "^2.1",
1552
+ "sebastian/comparator": "^3.0",
1553
+ "sebastian/diff": "^3.0",
1554
+ "sebastian/environment": "^4.0",
1555
+ "sebastian/exporter": "^3.1",
1556
+ "sebastian/global-state": "^2.0",
1557
+ "sebastian/object-enumerator": "^3.0.3",
1558
+ "sebastian/resource-operations": "^2.0",
1559
+ "sebastian/version": "^2.0.1"
1560
+ },
1561
+ "conflict": {
1562
+ "phpunit/phpunit-mock-objects": "*"
1563
+ },
1564
+ "require-dev": {
1565
+ "ext-pdo": "*"
1566
+ },
1567
+ "suggest": {
1568
+ "ext-soap": "*",
1569
+ "ext-xdebug": "*",
1570
+ "phpunit/php-invoker": "^2.0"
1571
+ },
1572
+ "bin": [
1573
+ "phpunit"
1574
+ ],
1575
+ "type": "library",
1576
+ "extra": {
1577
+ "branch-alias": {
1578
+ "dev-master": "7.5-dev"
1579
+ }
1580
+ },
1581
+ "autoload": {
1582
+ "classmap": [
1583
+ "src/"
1584
+ ]
1585
+ },
1586
+ "notification-url": "https://packagist.org/downloads/",
1587
+ "license": [
1588
+ "BSD-3-Clause"
1589
+ ],
1590
+ "authors": [
1591
+ {
1592
+ "name": "Sebastian Bergmann",
1593
+ "email": "sebastian@phpunit.de",
1594
+ "role": "lead"
1595
+ }
1596
+ ],
1597
+ "description": "The PHP Unit Testing framework.",
1598
+ "homepage": "https://phpunit.de/",
1599
+ "keywords": [
1600
+ "phpunit",
1601
+ "testing",
1602
+ "xunit"
1603
+ ],
1604
+ "time": "2020-01-08T08:45:45+00:00"
1605
+ },
1606
+ {
1607
+ "name": "roots/wordpress",
1608
+ "version": "5.6",
1609
+ "source": {
1610
+ "type": "git",
1611
+ "url": "https://github.com/WordPress/WordPress.git",
1612
+ "reference": "5.6"
1613
+ },
1614
+ "dist": {
1615
+ "type": "zip",
1616
+ "url": "https://api.github.com/repos/WordPress/WordPress/zipball/5.6"
1617
+ },
1618
+ "require": {
1619
+ "php": ">=5.3.2",
1620
+ "roots/wordpress-core-installer": ">=1.0.0"
1621
+ },
1622
+ "type": "wordpress-core",
1623
+ "notification-url": "https://packagist.org/downloads/",
1624
+ "license": [
1625
+ "GPL-2.0-or-later"
1626
+ ],
1627
+ "authors": [
1628
+ {
1629
+ "name": "WordPress Community",
1630
+ "homepage": "https://wordpress.org/about/"
1631
+ }
1632
+ ],
1633
+ "description": "WordPress is web software you can use to create a beautiful website or blog.",
1634
+ "homepage": "https://wordpress.org/",
1635
+ "keywords": [
1636
+ "blog",
1637
+ "cms",
1638
+ "wordpress"
1639
+ ],
1640
+ "time": "2020-12-08T22:15:57+00:00"
1641
+ },
1642
+ {
1643
+ "name": "roots/wordpress-core-installer",
1644
+ "version": "1.100.0",
1645
+ "source": {
1646
+ "type": "git",
1647
+ "url": "https://github.com/roots/wordpress-core-installer.git",
1648
+ "reference": "73f8488e5178c5d54234b919f823a9095e2b1847"
1649
+ },
1650
+ "dist": {
1651
+ "type": "zip",
1652
+ "url": "https://api.github.com/repos/roots/wordpress-core-installer/zipball/73f8488e5178c5d54234b919f823a9095e2b1847",
1653
+ "reference": "73f8488e5178c5d54234b919f823a9095e2b1847",
1654
+ "shasum": ""
1655
+ },
1656
+ "require": {
1657
+ "composer-plugin-api": "^1.0 || ^2.0",
1658
+ "php": ">=5.6.0"
1659
+ },
1660
+ "conflict": {
1661
+ "composer/installers": "<1.0.6"
1662
+ },
1663
+ "replace": {
1664
+ "johnpbloch/wordpress-core-installer": "*"
1665
+ },
1666
+ "require-dev": {
1667
+ "composer/composer": "^1.0 || ^2.0",
1668
+ "phpunit/phpunit": ">=5.7.27"
1669
+ },
1670
+ "type": "composer-plugin",
1671
+ "extra": {
1672
+ "class": "Roots\\Composer\\WordPressCorePlugin"
1673
+ },
1674
+ "autoload": {
1675
+ "psr-4": {
1676
+ "Roots\\Composer\\": "src/"
1677
+ }
1678
+ },
1679
+ "notification-url": "https://packagist.org/downloads/",
1680
+ "license": [
1681
+ "GPL-2.0-or-later"
1682
+ ],
1683
+ "authors": [
1684
+ {
1685
+ "name": "John P. Bloch",
1686
+ "email": "me@johnpbloch.com"
1687
+ },
1688
+ {
1689
+ "name": "Roots",
1690
+ "email": "team@roots.io"
1691
+ }
1692
+ ],
1693
+ "description": "A custom installer to handle deploying WordPress with composer",
1694
+ "keywords": [
1695
+ "wordpress"
1696
+ ],
1697
+ "time": "2020-08-20T00:27:30+00:00"
1698
+ },
1699
+ {
1700
+ "name": "sebastian/code-unit-reverse-lookup",
1701
+ "version": "1.0.2",
1702
+ "source": {
1703
+ "type": "git",
1704
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1705
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
1706
+ },
1707
+ "dist": {
1708
+ "type": "zip",
1709
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
1710
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
1711
+ "shasum": ""
1712
+ },
1713
+ "require": {
1714
+ "php": ">=5.6"
1715
+ },
1716
+ "require-dev": {
1717
+ "phpunit/phpunit": "^8.5"
1718
+ },
1719
+ "type": "library",
1720
+ "extra": {
1721
+ "branch-alias": {
1722
+ "dev-master": "1.0.x-dev"
1723
+ }
1724
+ },
1725
+ "autoload": {
1726
+ "classmap": [
1727
+ "src/"
1728
+ ]
1729
+ },
1730
+ "notification-url": "https://packagist.org/downloads/",
1731
+ "license": [
1732
+ "BSD-3-Clause"
1733
+ ],
1734
+ "authors": [
1735
+ {
1736
+ "name": "Sebastian Bergmann",
1737
+ "email": "sebastian@phpunit.de"
1738
+ }
1739
+ ],
1740
+ "description": "Looks up which function or method a line of code belongs to",
1741
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1742
+ "time": "2020-11-30T08:15:22+00:00"
1743
+ },
1744
+ {
1745
+ "name": "sebastian/comparator",
1746
+ "version": "3.0.3",
1747
+ "source": {
1748
+ "type": "git",
1749
+ "url": "https://github.com/sebastianbergmann/comparator.git",
1750
+ "reference": "1071dfcef776a57013124ff35e1fc41ccd294758"
1751
+ },
1752
+ "dist": {
1753
+ "type": "zip",
1754
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758",
1755
+ "reference": "1071dfcef776a57013124ff35e1fc41ccd294758",
1756
+ "shasum": ""
1757
+ },
1758
+ "require": {
1759
+ "php": ">=7.1",
1760
+ "sebastian/diff": "^3.0",
1761
+ "sebastian/exporter": "^3.1"
1762
+ },
1763
+ "require-dev": {
1764
+ "phpunit/phpunit": "^8.5"
1765
+ },
1766
+ "type": "library",
1767
+ "extra": {
1768
+ "branch-alias": {
1769
+ "dev-master": "3.0-dev"
1770
+ }
1771
+ },
1772
+ "autoload": {
1773
+ "classmap": [
1774
+ "src/"
1775
+ ]
1776
+ },
1777
+ "notification-url": "https://packagist.org/downloads/",
1778
+ "license": [
1779
+ "BSD-3-Clause"
1780
+ ],
1781
+ "authors": [
1782
+ {
1783
+ "name": "Sebastian Bergmann",
1784
+ "email": "sebastian@phpunit.de"
1785
+ },
1786
+ {
1787
+ "name": "Jeff Welch",
1788
+ "email": "whatthejeff@gmail.com"
1789
+ },
1790
+ {
1791
+ "name": "Volker Dusch",
1792
+ "email": "github@wallbash.com"
1793
+ },
1794
+ {
1795
+ "name": "Bernhard Schussek",
1796
+ "email": "bschussek@2bepublished.at"
1797
+ }
1798
+ ],
1799
+ "description": "Provides the functionality to compare PHP values for equality",
1800
+ "homepage": "https://github.com/sebastianbergmann/comparator",
1801
+ "keywords": [
1802
+ "comparator",
1803
+ "compare",
1804
+ "equality"
1805
+ ],
1806
+ "time": "2020-11-30T08:04:30+00:00"
1807
+ },
1808
+ {
1809
+ "name": "sebastian/diff",
1810
+ "version": "3.0.3",
1811
+ "source": {
1812
+ "type": "git",
1813
+ "url": "https://github.com/sebastianbergmann/diff.git",
1814
+ "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211"
1815
+ },
1816
+ "dist": {
1817
+ "type": "zip",
1818
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
1819
+ "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211",
1820
+ "shasum": ""
1821
+ },
1822
+ "require": {
1823
+ "php": ">=7.1"
1824
+ },
1825
+ "require-dev": {
1826
+ "phpunit/phpunit": "^7.5 || ^8.0",
1827
+ "symfony/process": "^2 || ^3.3 || ^4"
1828
+ },
1829
+ "type": "library",
1830
+ "extra": {
1831
+ "branch-alias": {
1832
+ "dev-master": "3.0-dev"
1833
+ }
1834
+ },
1835
+ "autoload": {
1836
+ "classmap": [
1837
+ "src/"
1838
+ ]
1839
+ },
1840
+ "notification-url": "https://packagist.org/downloads/",
1841
+ "license": [
1842
+ "BSD-3-Clause"
1843
+ ],
1844
+ "authors": [
1845
+ {
1846
+ "name": "Sebastian Bergmann",
1847
+ "email": "sebastian@phpunit.de"
1848
+ },
1849
+ {
1850
+ "name": "Kore Nordmann",
1851
+ "email": "mail@kore-nordmann.de"
1852
+ }
1853
+ ],
1854
+ "description": "Diff implementation",
1855
+ "homepage": "https://github.com/sebastianbergmann/diff",
1856
+ "keywords": [
1857
+ "diff",
1858
+ "udiff",
1859
+ "unidiff",
1860
+ "unified diff"
1861
+ ],
1862
+ "time": "2020-11-30T07:59:04+00:00"
1863
+ },
1864
+ {
1865
+ "name": "sebastian/environment",
1866
+ "version": "4.2.4",
1867
+ "source": {
1868
+ "type": "git",
1869
+ "url": "https://github.com/sebastianbergmann/environment.git",
1870
+ "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0"
1871
+ },
1872
+ "dist": {
1873
+ "type": "zip",
1874
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
1875
+ "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0",
1876
+ "shasum": ""
1877
+ },
1878
+ "require": {
1879
+ "php": ">=7.1"
1880
+ },
1881
+ "require-dev": {
1882
+ "phpunit/phpunit": "^7.5"
1883
+ },
1884
+ "suggest": {
1885
+ "ext-posix": "*"
1886
+ },
1887
+ "type": "library",
1888
+ "extra": {
1889
+ "branch-alias": {
1890
+ "dev-master": "4.2-dev"
1891
+ }
1892
+ },
1893
+ "autoload": {
1894
+ "classmap": [
1895
+ "src/"
1896
+ ]
1897
+ },
1898
+ "notification-url": "https://packagist.org/downloads/",
1899
+ "license": [
1900
+ "BSD-3-Clause"
1901
+ ],
1902
+ "authors": [
1903
+ {
1904
+ "name": "Sebastian Bergmann",
1905
+ "email": "sebastian@phpunit.de"
1906
+ }
1907
+ ],
1908
+ "description": "Provides functionality to handle HHVM/PHP environments",
1909
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
1910
+ "keywords": [
1911
+ "Xdebug",
1912
+ "environment",
1913
+ "hhvm"
1914
+ ],
1915
+ "time": "2020-11-30T07:53:42+00:00"
1916
+ },
1917
+ {
1918
+ "name": "sebastian/exporter",
1919
+ "version": "3.1.3",
1920
+ "source": {
1921
+ "type": "git",
1922
+ "url": "https://github.com/sebastianbergmann/exporter.git",
1923
+ "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e"
1924
+ },
1925
+ "dist": {
1926
+ "type": "zip",
1927
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e",
1928
+ "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e",
1929
+ "shasum": ""
1930
+ },
1931
+ "require": {
1932
+ "php": ">=7.0",
1933
+ "sebastian/recursion-context": "^3.0"
1934
+ },
1935
+ "require-dev": {
1936
+ "ext-mbstring": "*",
1937
+ "phpunit/phpunit": "^6.0"
1938
+ },
1939
+ "type": "library",
1940
+ "extra": {
1941
+ "branch-alias": {
1942
+ "dev-master": "3.1.x-dev"
1943
+ }
1944
+ },
1945
+ "autoload": {
1946
+ "classmap": [
1947
+ "src/"
1948
+ ]
1949
+ },
1950
+ "notification-url": "https://packagist.org/downloads/",
1951
+ "license": [
1952
+ "BSD-3-Clause"
1953
+ ],
1954
+ "authors": [
1955
+ {
1956
+ "name": "Sebastian Bergmann",
1957
+ "email": "sebastian@phpunit.de"
1958
+ },
1959
+ {
1960
+ "name": "Jeff Welch",
1961
+ "email": "whatthejeff@gmail.com"
1962
+ },
1963
+ {
1964
+ "name": "Volker Dusch",
1965
+ "email": "github@wallbash.com"
1966
+ },
1967
+ {
1968
+ "name": "Adam Harvey",
1969
+ "email": "aharvey@php.net"
1970
+ },
1971
+ {
1972
+ "name": "Bernhard Schussek",
1973
+ "email": "bschussek@gmail.com"
1974
+ }
1975
+ ],
1976
+ "description": "Provides the functionality to export PHP variables for visualization",
1977
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
1978
+ "keywords": [
1979
+ "export",
1980
+ "exporter"
1981
+ ],
1982
+ "time": "2020-11-30T07:47:53+00:00"
1983
+ },
1984
+ {
1985
+ "name": "sebastian/global-state",
1986
+ "version": "2.0.0",
1987
+ "source": {
1988
+ "type": "git",
1989
+ "url": "https://github.com/sebastianbergmann/global-state.git",
1990
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
1991
+ },
1992
+ "dist": {
1993
+ "type": "zip",
1994
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1995
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1996
+ "shasum": ""
1997
+ },
1998
+ "require": {
1999
+ "php": "^7.0"
2000
+ },
2001
+ "require-dev": {
2002
+ "phpunit/phpunit": "^6.0"
2003
+ },
2004
+ "suggest": {
2005
+ "ext-uopz": "*"
2006
+ },
2007
+ "type": "library",
2008
+ "extra": {
2009
+ "branch-alias": {
2010
+ "dev-master": "2.0-dev"
2011
+ }
2012
+ },
2013
+ "autoload": {
2014
+ "classmap": [
2015
+ "src/"
2016
+ ]
2017
+ },
2018
+ "notification-url": "https://packagist.org/downloads/",
2019
+ "license": [
2020
+ "BSD-3-Clause"
2021
+ ],
2022
+ "authors": [
2023
+ {
2024
+ "name": "Sebastian Bergmann",
2025
+ "email": "sebastian@phpunit.de"
2026
+ }
2027
+ ],
2028
+ "description": "Snapshotting of global state",
2029
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
2030
+ "keywords": [
2031
+ "global state"
2032
+ ],
2033
+ "time": "2017-04-27T15:39:26+00:00"
2034
+ },
2035
+ {
2036
+ "name": "sebastian/object-enumerator",
2037
+ "version": "3.0.4",
2038
+ "source": {
2039
+ "type": "git",
2040
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2041
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
2042
+ },
2043
+ "dist": {
2044
+ "type": "zip",
2045
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
2046
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
2047
+ "shasum": ""
2048
+ },
2049
+ "require": {
2050
+ "php": ">=7.0",
2051
+ "sebastian/object-reflector": "^1.1.1",
2052
+ "sebastian/recursion-context": "^3.0"
2053
+ },
2054
+ "require-dev": {
2055
+ "phpunit/phpunit": "^6.0"
2056
+ },
2057
+ "type": "library",
2058
+ "extra": {
2059
+ "branch-alias": {
2060
+ "dev-master": "3.0.x-dev"
2061
+ }
2062
+ },
2063
+ "autoload": {
2064
+ "classmap": [
2065
+ "src/"
2066
+ ]
2067
+ },
2068
+ "notification-url": "https://packagist.org/downloads/",
2069
+ "license": [
2070
+ "BSD-3-Clause"
2071
+ ],
2072
+ "authors": [
2073
+ {
2074
+ "name": "Sebastian Bergmann",
2075
+ "email": "sebastian@phpunit.de"
2076
+ }
2077
+ ],
2078
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2079
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2080
+ "time": "2020-11-30T07:40:27+00:00"
2081
+ },
2082
+ {
2083
+ "name": "sebastian/object-reflector",
2084
+ "version": "1.1.2",
2085
+ "source": {
2086
+ "type": "git",
2087
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
2088
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
2089
+ },
2090
+ "dist": {
2091
+ "type": "zip",
2092
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
2093
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
2094
+ "shasum": ""
2095
+ },
2096
+ "require": {
2097
+ "php": ">=7.0"
2098
+ },
2099
+ "require-dev": {
2100
+ "phpunit/phpunit": "^6.0"
2101
+ },
2102
+ "type": "library",
2103
+ "extra": {
2104
+ "branch-alias": {
2105
+ "dev-master": "1.1-dev"
2106
+ }
2107
+ },
2108
+ "autoload": {
2109
+ "classmap": [
2110
+ "src/"
2111
+ ]
2112
+ },
2113
+ "notification-url": "https://packagist.org/downloads/",
2114
+ "license": [
2115
+ "BSD-3-Clause"
2116
+ ],
2117
+ "authors": [
2118
+ {
2119
+ "name": "Sebastian Bergmann",
2120
+ "email": "sebastian@phpunit.de"
2121
+ }
2122
+ ],
2123
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
2124
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2125
+ "time": "2020-11-30T07:37:18+00:00"
2126
+ },
2127
+ {
2128
+ "name": "sebastian/recursion-context",
2129
+ "version": "3.0.1",
2130
+ "source": {
2131
+ "type": "git",
2132
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
2133
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
2134
+ },
2135
+ "dist": {
2136
+ "type": "zip",
2137
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
2138
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
2139
+ "shasum": ""
2140
+ },
2141
+ "require": {
2142
+ "php": ">=7.0"
2143
+ },
2144
+ "require-dev": {
2145
+ "phpunit/phpunit": "^6.0"
2146
+ },
2147
+ "type": "library",
2148
+ "extra": {
2149
+ "branch-alias": {
2150
+ "dev-master": "3.0.x-dev"
2151
+ }
2152
+ },
2153
+ "autoload": {
2154
+ "classmap": [
2155
+ "src/"
2156
+ ]
2157
+ },
2158
+ "notification-url": "https://packagist.org/downloads/",
2159
+ "license": [
2160
+ "BSD-3-Clause"
2161
+ ],
2162
+ "authors": [
2163
+ {
2164
+ "name": "Sebastian Bergmann",
2165
+ "email": "sebastian@phpunit.de"
2166
+ },
2167
+ {
2168
+ "name": "Jeff Welch",
2169
+ "email": "whatthejeff@gmail.com"
2170
+ },
2171
+ {
2172
+ "name": "Adam Harvey",
2173
+ "email": "aharvey@php.net"
2174
+ }
2175
+ ],
2176
+ "description": "Provides functionality to recursively process PHP variables",
2177
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2178
+ "time": "2020-11-30T07:34:24+00:00"
2179
+ },
2180
+ {
2181
+ "name": "sebastian/resource-operations",
2182
+ "version": "2.0.2",
2183
+ "source": {
2184
+ "type": "git",
2185
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
2186
+ "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3"
2187
+ },
2188
+ "dist": {
2189
+ "type": "zip",
2190
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3",
2191
+ "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3",
2192
+ "shasum": ""
2193
+ },
2194
+ "require": {
2195
+ "php": ">=7.1"
2196
+ },
2197
+ "type": "library",
2198
+ "extra": {
2199
+ "branch-alias": {
2200
+ "dev-master": "2.0-dev"
2201
+ }
2202
+ },
2203
+ "autoload": {
2204
+ "classmap": [
2205
+ "src/"
2206
+ ]
2207
+ },
2208
+ "notification-url": "https://packagist.org/downloads/",
2209
+ "license": [
2210
+ "BSD-3-Clause"
2211
+ ],
2212
+ "authors": [
2213
+ {
2214
+ "name": "Sebastian Bergmann",
2215
+ "email": "sebastian@phpunit.de"
2216
+ }
2217
+ ],
2218
+ "description": "Provides a list of PHP built-in functions that operate on resources",
2219
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2220
+ "time": "2020-11-30T07:30:19+00:00"
2221
+ },
2222
+ {
2223
+ "name": "sebastian/version",
2224
+ "version": "2.0.1",
2225
+ "source": {
2226
+ "type": "git",
2227
+ "url": "https://github.com/sebastianbergmann/version.git",
2228
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
2229
+ },
2230
+ "dist": {
2231
+ "type": "zip",
2232
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
2233
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
2234
+ "shasum": ""
2235
+ },
2236
+ "require": {
2237
+ "php": ">=5.6"
2238
+ },
2239
+ "type": "library",
2240
+ "extra": {
2241
+ "branch-alias": {
2242
+ "dev-master": "2.0.x-dev"
2243
+ }
2244
+ },
2245
+ "autoload": {
2246
+ "classmap": [
2247
+ "src/"
2248
+ ]
2249
+ },
2250
+ "notification-url": "https://packagist.org/downloads/",
2251
+ "license": [
2252
+ "BSD-3-Clause"
2253
+ ],
2254
+ "authors": [
2255
+ {
2256
+ "name": "Sebastian Bergmann",
2257
+ "email": "sebastian@phpunit.de",
2258
+ "role": "lead"
2259
+ }
2260
+ ],
2261
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2262
+ "homepage": "https://github.com/sebastianbergmann/version",
2263
+ "time": "2016-10-03T07:35:21+00:00"
2264
+ },
2265
+ {
2266
+ "name": "theseer/tokenizer",
2267
+ "version": "1.2.0",
2268
+ "source": {
2269
+ "type": "git",
2270
+ "url": "https://github.com/theseer/tokenizer.git",
2271
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
2272
+ },
2273
+ "dist": {
2274
+ "type": "zip",
2275
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
2276
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
2277
+ "shasum": ""
2278
+ },
2279
+ "require": {
2280
+ "ext-dom": "*",
2281
+ "ext-tokenizer": "*",
2282
+ "ext-xmlwriter": "*",
2283
+ "php": "^7.2 || ^8.0"
2284
+ },
2285
+ "type": "library",
2286
+ "autoload": {
2287
+ "classmap": [
2288
+ "src/"
2289
+ ]
2290
+ },
2291
+ "notification-url": "https://packagist.org/downloads/",
2292
+ "license": [
2293
+ "BSD-3-Clause"
2294
+ ],
2295
+ "authors": [
2296
+ {
2297
+ "name": "Arne Blankerts",
2298
+ "email": "arne@blankerts.de",
2299
+ "role": "Developer"
2300
+ }
2301
+ ],
2302
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2303
+ "time": "2020-07-12T23:59:07+00:00"
2304
+ },
2305
+ {
2306
+ "name": "webmozart/assert",
2307
+ "version": "1.9.1",
2308
+ "source": {
2309
+ "type": "git",
2310
+ "url": "https://github.com/webmozarts/assert.git",
2311
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
2312
+ },
2313
+ "dist": {
2314
+ "type": "zip",
2315
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
2316
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
2317
+ "shasum": ""
2318
+ },
2319
+ "require": {
2320
+ "php": "^5.3.3 || ^7.0 || ^8.0",
2321
+ "symfony/polyfill-ctype": "^1.8"
2322
+ },
2323
+ "conflict": {
2324
+ "phpstan/phpstan": "<0.12.20",
2325
+ "vimeo/psalm": "<3.9.1"
2326
+ },
2327
+ "require-dev": {
2328
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
2329
+ },
2330
+ "type": "library",
2331
+ "autoload": {
2332
+ "psr-4": {
2333
+ "Webmozart\\Assert\\": "src/"
2334
+ }
2335
+ },
2336
+ "notification-url": "https://packagist.org/downloads/",
2337
+ "license": [
2338
+ "MIT"
2339
+ ],
2340
+ "authors": [
2341
+ {
2342
+ "name": "Bernhard Schussek",
2343
+ "email": "bschussek@gmail.com"
2344
+ }
2345
+ ],
2346
+ "description": "Assertions to validate method input/output with nice error messages.",
2347
+ "keywords": [
2348
+ "assert",
2349
+ "check",
2350
+ "validate"
2351
+ ],
2352
+ "time": "2020-07-08T17:02:28+00:00"
2353
+ },
2354
+ {
2355
+ "name": "wp-phpunit/wp-phpunit",
2356
+ "version": "5.6.0",
2357
+ "source": {
2358
+ "type": "git",
2359
+ "url": "https://github.com/wp-phpunit/wp-phpunit.git",
2360
+ "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9"
2361
+ },
2362
+ "dist": {
2363
+ "type": "zip",
2364
+ "url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/7130a214573cc8c12a0f8fe8a74b18b453bce1e9",
2365
+ "reference": "7130a214573cc8c12a0f8fe8a74b18b453bce1e9",
2366
+ "shasum": ""
2367
+ },
2368
+ "type": "library",
2369
+ "autoload": {
2370
+ "files": [
2371
+ "__loaded.php"
2372
+ ]
2373
+ },
2374
+ "notification-url": "https://packagist.org/downloads/",
2375
+ "license": [
2376
+ "GPL-2.0-or-later"
2377
+ ],
2378
+ "authors": [
2379
+ {
2380
+ "name": "Evan Mattson",
2381
+ "email": "me@aaemnnost.tv"
2382
+ },
2383
+ {
2384
+ "name": "WordPress Community",
2385
+ "homepage": "https://wordpress.org/about/"
2386
+ }
2387
+ ],
2388
+ "description": "WordPress core PHPUnit library",
2389
+ "homepage": "https://github.com/wp-phpunit",
2390
+ "keywords": [
2391
+ "phpunit",
2392
+ "test",
2393
+ "wordpress"
2394
+ ],
2395
+ "time": "2020-12-09T18:06:02+00:00"
2396
  }
2397
  ],
 
2398
  "aliases": [],
2399
  "minimum-stability": "stable",
2400
  "stability-flags": [],
2401
  "prefer-stable": false,
2402
  "prefer-lowest": false,
2403
  "platform": {
2404
+ "php": ">=7.2.5"
2405
  },
2406
  "platform-dev": []
2407
  }
data-sources/abstract.php CHANGED
@@ -98,11 +98,11 @@ abstract class AbstractReader implements \YellowTree\GeoipDetect\DataSources\Rea
98
  $this->options = $options;
99
  }
100
 
101
- public function city($ip) {
102
  throw new \BadMethodCallException('This datasource does not provide data for city()');
103
  }
104
 
105
- public function country($ip) {
106
  throw new \BadMethodCallException('This datasource does not provide data for country()');
107
  }
108
 
98
  $this->options = $options;
99
  }
100
 
101
+ public function city(string $ip): \GeoIp2\Model\City {
102
  throw new \BadMethodCallException('This datasource does not provide data for city()');
103
  }
104
 
105
+ public function country(string $ip): \GeoIp2\Model\Country {
106
  throw new \BadMethodCallException('This datasource does not provide data for country()');
107
  }
108
 
data-sources/auto.php CHANGED
@@ -312,11 +312,13 @@ HTML;
312
  }
313
 
314
  public function activate() {
 
315
  $this->set_cron_schedule();
316
  }
317
 
318
  public function deactivate()
319
  {
 
320
  wp_clear_scheduled_hook('geoipdetectupdate');
321
  }
322
 
312
  }
313
 
314
  public function activate() {
315
+ parent::activate();
316
  $this->set_cron_schedule();
317
  }
318
 
319
  public function deactivate()
320
  {
321
+ parent::deactivate();
322
  wp_clear_scheduled_hook('geoipdetectupdate');
323
  }
324
 
data-sources/header.php CHANGED
@@ -29,7 +29,7 @@ class HeaderReader extends \YellowTree\GeoipDetect\DataSources\AbstractReader {
29
  'cloudflare' => 'Cloudflare',
30
  );
31
 
32
- public function country($ip) {
33
 
34
  $r = array();
35
 
@@ -51,7 +51,7 @@ class HeaderReader extends \YellowTree\GeoipDetect\DataSources\AbstractReader {
51
  }
52
  $country = '';
53
  if (!$isoCode) {
54
- return null;
55
  }
56
 
57
  $r['country']['iso_code'] = strtoupper($isoCode);
29
  'cloudflare' => 'Cloudflare',
30
  );
31
 
32
+ public function country($ip) : \GeoIp2\Model\Country {
33
 
34
  $r = array();
35
 
51
  }
52
  $country = '';
53
  if (!$isoCode) {
54
+ return _geoip_detect2_get_new_empty_record();
55
  }
56
 
57
  $r['country']['iso_code'] = strtoupper($isoCode);
data-sources/hostinfo.php CHANGED
@@ -17,14 +17,14 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
17
  $this->options = $options + $default_options;
18
  }
19
 
20
- public function city($ip) {
21
  if (!geoip_detect_is_ip($ip, true))
22
  throw new \Exception('The Hostip.info-Database only contains IPv4 adresses.');
23
 
24
  $data = $this->api_call($ip);
25
 
26
  if (!$data)
27
- return null;
28
 
29
  $r = array();
30
 
@@ -46,7 +46,7 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
46
  return $record;
47
  }
48
 
49
- public function country($ip) {
50
  return $this->city($ip); // too much info shouldn't hurt ...
51
  }
52
 
17
  $this->options = $options + $default_options;
18
  }
19
 
20
+ public function city($ip): \GeoIp2\Model\City {
21
  if (!geoip_detect_is_ip($ip, true))
22
  throw new \Exception('The Hostip.info-Database only contains IPv4 adresses.');
23
 
24
  $data = $this->api_call($ip);
25
 
26
  if (!$data)
27
+ return _geoip_detect2_get_new_empty_record();
28
 
29
  $r = array();
30
 
46
  return $record;
47
  }
48
 
49
+ public function country($ip): \GeoIp2\Model\Country {
50
  return $this->city($ip); // too much info shouldn't hurt ...
51
  }
52
 
data-sources/ipstack.php CHANGED
@@ -49,11 +49,11 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
49
  return $locales;
50
  }
51
 
52
- public function city($ip) {
53
  $data = $this->api_call($ip);
54
 
55
  if (!$data)
56
- return null;
57
 
58
  $r = array();
59
 
@@ -98,8 +98,9 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
98
  if (!empty($data['longitude']))
99
  $r['location']['longitude'] = $data['longitude'];
100
 
101
- if (isset($data['is_eu']))
102
- $r['country']['is_in_european_union'] = $data['is_eu'];
 
103
  if (isset($data['timezone']['id']))
104
  $r['location']['time_zone'] = $data['timezone']['id'];
105
 
@@ -127,7 +128,7 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
127
  return $record;
128
  }
129
 
130
- public function country($ip) {
131
  return $this->city($ip); // too much info shouldn't hurt ...
132
  }
133
 
49
  return $locales;
50
  }
51
 
52
+ public function city($ip) : \GeoIp2\Model\City {
53
  $data = $this->api_call($ip);
54
 
55
  if (!$data)
56
+ return _geoip_detect2_get_new_empty_record();
57
 
58
  $r = array();
59
 
98
  if (!empty($data['longitude']))
99
  $r['location']['longitude'] = $data['longitude'];
100
 
101
+ if (!empty($data['location']['is_eu'])) {
102
+ $r['country']['is_in_european_union'] = $data['location']['is_eu'];
103
+ }
104
  if (isset($data['timezone']['id']))
105
  $r['location']['time_zone'] = $data['timezone']['id'];
106
 
128
  return $record;
129
  }
130
 
131
+ public function country($ip) : \GeoIp2\Model\Country {
132
  return $this->city($ip); // too much info shouldn't hurt ...
133
  }
134
 
data-sources/manual.php CHANGED
@@ -62,11 +62,15 @@ class ManualDataSource extends AbstractDataSource {
62
  $html = '';
63
  $last_update = get_option('geoip_detect2_maxmind_ccpa_blacklist_last_updated', 0);
64
  $entries = get_option('geoip_detect2_maxmind_ccpa_blacklist');
 
65
 
66
  $html .= sprintf(__('Privacy Exclusions last updated: %s', 'geoip-detect'), geoip_detect_format_localtime($last_update) );
67
  if ($entries) {
68
  $html .= ' ' . sprintf(__('(has %d entries)', 'geoip-detect'), count($entries));
69
  }
 
 
 
70
 
71
  return $html;
72
  }
@@ -86,6 +90,25 @@ HTML;
86
  return $html;
87
  }
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  protected function saveParametersMaxmindAccount($post) {
90
  $message = '';
91
 
@@ -104,14 +127,9 @@ HTML;
104
  $message .= __('This is not a valid Maxmind Account ID.', 'geoip-detect');
105
  }
106
  $idChanged = update_option('geoip-detect-auto_license_id', $id);
107
- if ($id && class_exists('\\YellowTree\\GeoipDetect\\Lib\\CcpaBlacklistCron')) {
108
- $ccpaCronScheduler = new \YellowTree\GeoipDetect\Lib\CcpaBlacklistCron;
109
- if ($idChanged || $keyChanged) {
110
- // Re-schedule and run it right now
111
- $ccpaCronScheduler->schedule(true);
112
- } else {
113
- $ccpaCronScheduler->schedule();
114
- }
115
  }
116
  }
117
 
62
  $html = '';
63
  $last_update = get_option('geoip_detect2_maxmind_ccpa_blacklist_last_updated', 0);
64
  $entries = get_option('geoip_detect2_maxmind_ccpa_blacklist');
65
+ $next_update = wp_next_scheduled('geoipdetectccpaupdate');
66
 
67
  $html .= sprintf(__('Privacy Exclusions last updated: %s', 'geoip-detect'), geoip_detect_format_localtime($last_update) );
68
  if ($entries) {
69
  $html .= ' ' . sprintf(__('(has %d entries)', 'geoip-detect'), count($entries));
70
  }
71
+ if (WP_DEBUG) {
72
+ $html .= '<br>' . sprintf(__('Privacy Exclusions next Update: %s', 'geoip-detect'), geoip_detect_format_localtime($next_update) );
73
+ }
74
 
75
  return $html;
76
  }
90
  return $html;
91
  }
92
 
93
+ protected function scheduleCcpa($forceRunNow = false) {
94
+ if (!class_exists('\\YellowTree\\GeoipDetect\\Lib\\CcpaBlacklistCron')) {
95
+ return;
96
+ }
97
+ $ccpaCronScheduler = new \YellowTree\GeoipDetect\Lib\CcpaBlacklistCron;
98
+ $ccpaCronScheduler->schedule(true);
99
+ }
100
+
101
+ protected function unscheduleCcpa() {
102
+ wp_clear_scheduled_hook('geoipdetectccpaupdate');
103
+ }
104
+
105
+ public function activate() {
106
+ $this->scheduleCcpa();
107
+ }
108
+ public function deactivate() {
109
+ $this->unscheduleCcpa();
110
+ }
111
+
112
  protected function saveParametersMaxmindAccount($post) {
113
  $message = '';
114
 
127
  $message .= __('This is not a valid Maxmind Account ID.', 'geoip-detect');
128
  }
129
  $idChanged = update_option('geoip-detect-auto_license_id', $id);
130
+ $forceRunNow = $idChanged || $keyChanged;
131
+ if ($id) {
132
+ $this->scheduleCcpa($forceRunNow);
 
 
 
 
 
133
  }
134
  }
135
 
data-sources/precision.php CHANGED
@@ -37,7 +37,7 @@ class PrecisionReader extends \GeoIp2\WebService\Client implements \YellowTree\G
37
  parent::__construct($userId, $licenseKey, array('en'), $options);
38
  }
39
 
40
- public function city($ip = 'me') {
41
  $method = get_option('geoip-detect-precision_api_type', 'city');
42
 
43
  $ret = null;
37
  parent::__construct($userId, $licenseKey, array('en'), $options);
38
  }
39
 
40
+ public function city($ip = 'me') : \GeoIp2\Model\City {
41
  $method = get_option('geoip-detect-precision_api_type', 'city');
42
 
43
  $ret = null;
data-sources/registry.php CHANGED
@@ -126,6 +126,17 @@ class DataSourceRegistry {
126
  return $this->isSourceCachable($this->getCurrentSourceId());
127
  }
128
 
 
 
 
 
 
 
 
 
 
 
 
129
  public function uninstall() {
130
  foreach($this->sources as $source) {
131
  $source->deactivate();
@@ -138,5 +149,7 @@ class DataSourceRegistry {
138
  delete_option( $option );
139
  }
140
  }
 
 
141
  }
142
  }
126
  return $this->isSourceCachable($this->getCurrentSourceId());
127
  }
128
 
129
+ public function clearCache() {
130
+ if (wp_using_ext_object_cache()) {
131
+ if (WP_DEBUG) {
132
+ \trigger_error('Object caching is active, so transient deletion routine does not do anything ...', E_USER_NOTICE);
133
+ return 'Object caching is active, so transient deletion routine does not do anything ...';
134
+ }
135
+ } else {
136
+ return _geoip_detect2_empty_cache();
137
+ }
138
+ }
139
+
140
  public function uninstall() {
141
  foreach($this->sources as $source) {
142
  $source->deactivate();
149
  delete_option( $option );
150
  }
151
  }
152
+
153
+ $this->clearCache();
154
  }
155
  }
deprecated.php CHANGED
@@ -20,4 +20,32 @@ function geoip_detect_get_abs_db_filename()
20
  if (is_object($reader) && method_exists($source, 'maxmindGetFilename'))
21
  return $source->maxmindGetFilename();
22
  return '';
23
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  if (is_object($reader) && method_exists($source, 'maxmindGetFilename'))
21
  return $source->maxmindGetFilename();
22
  return '';
23
+ }
24
+
25
+
26
+
27
+ /**
28
+ * @deprecated shortcode
29
+ */
30
+ function geoip_detect_shortcode($attr)
31
+ {
32
+ $userInfo = geoip_detect_get_info_from_current_ip();
33
+
34
+ $defaultValue = isset($attr['default']) ? $attr['default'] : '';
35
+
36
+ if (!is_object($userInfo))
37
+ return $defaultValue . '<!-- Geolocation IP Detection: No info found for this IP. -->';
38
+
39
+ $propertyName = $attr['property'];
40
+
41
+
42
+ if (property_exists($userInfo, $propertyName)) {
43
+ if ($userInfo->$propertyName)
44
+ return $userInfo->$propertyName;
45
+ else
46
+ return $defaultValue;
47
+ }
48
+
49
+ return $defaultValue . '<!-- Geolocation IP Detection: Invalid property name. -->';
50
+ }
51
+ add_shortcode('geoip_detect', 'geoip_detect_shortcode');
geoip-detect-lib.php CHANGED
@@ -111,7 +111,7 @@ function _geoip_detect2_get_reader($locales = null, $skipLocaleFilter = false, &
111
  return $reader;
112
  }
113
 
114
- function _ip_to_s($ip) {
115
  $binary = '';
116
  try {
117
  $binary = @inet_pton($ip);
@@ -165,12 +165,15 @@ function _geoip_detect2_add_data_to_cache($data, $ip) {
165
 
166
  function _geoip_detect2_empty_cache() {
167
  // This does not work for memcache. But it doesn't hurt either
168
- // ToDo expose to UI if Source is cacheable
169
  global $wpdb;
170
 
171
  $wpdb->query( "DELETE FROM `$wpdb->options` WHERE `option_name` LIKE ('_transient_geoip_detect_c_%')" );
 
172
  }
173
 
 
 
 
174
  function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
175
  $record = null;
176
 
@@ -199,15 +202,33 @@ function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
199
  $error = 'No reader was found. Check if the configuration is complete and correct.';
200
  }
201
 
 
 
 
 
202
  return $record;
203
  }
204
 
205
- function _geoip_detect2_record_enrich_data($record, $ip, $sourceId, $error) {
206
  $data = array('traits' => array('ip_address' => $ip), 'is_empty' => true);
 
 
 
 
207
  if (is_object($record) && method_exists($record, 'jsonSerialize')) {
208
  $data = $record->jsonSerialize();
 
 
 
 
 
209
  $data['is_empty'] = false;
210
  }
 
 
 
 
 
211
  $data['extra']['source'] = $sourceId;
212
  $data['extra']['cached'] = 0;
213
 
@@ -239,7 +260,7 @@ function _geoip_detect2_try_to_fix_timezone($data) {
239
  return $data;
240
 
241
  if (!function_exists('_geoip_detect_get_time_zone')) {
242
- require_once(GEOIP_PLUGIN_DIR . '/vendor/timezone.php');
243
  }
244
 
245
  if (!empty($data['country']['iso_code'])) {
@@ -287,7 +308,7 @@ add_filter('geoip_detect2_record_data', '_geoip_detect2_add_geonames_data');
287
  * IPv6-Adresses can be written in different formats. Make sure they are standardized.
288
  * For IPv4-Adresses, spaces are removed.
289
  */
290
- function geoip_detect_normalize_ip($ip) {
291
  $ip = trim($ip);
292
  $binary = '';
293
  try {
@@ -300,7 +321,7 @@ function geoip_detect_normalize_ip($ip) {
300
  return $ip;
301
  }
302
 
303
- function geoip_detect_sanitize_ip_list($ip_list) {
304
  $list = explode(',', $ip_list);
305
  $ret = array();
306
  foreach ($list as $ip) {
@@ -328,7 +349,7 @@ function geoip_detect_sanitize_ip_list($ip_list) {
328
  * @param string|array $expected IP (can include subnet)
329
  * @return boolean
330
  */
331
- function geoip_detect_is_ip_equal($actual, $expected) {
332
  try {
333
  return IpUtils::checkIp($actual, $expected);
334
  } catch(\Exception $e) {
@@ -342,7 +363,7 @@ function geoip_detect_is_ip_equal($actual, $expected) {
342
  }
343
  }
344
 
345
- function geoip_detect_is_ip($ip, $noIpv6 = false) {
346
  $flags = FILTER_FLAG_IPV4;
347
 
348
  if (GEOIP_DETECT_IPV6_SUPPORTED && !$noIpv6)
@@ -351,7 +372,7 @@ function geoip_detect_is_ip($ip, $noIpv6 = false) {
351
  return filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
352
  }
353
 
354
- function geoip_detect_is_ip_in_range($ip, $range_start, $range_end) {
355
  $long_ip = ip2long($ip);
356
  if ($long_ip === false) // Not IPv4
357
  return false;
@@ -366,7 +387,7 @@ function geoip_detect_is_ip_in_range($ip, $range_start, $range_end) {
366
  * @param string $ip IP (IPv4 or IPv6)
367
  * @return boolean TRUE if private
368
  */
369
- function geoip_detect_is_public_ip($ip) {
370
  // filver_var only detects 127.0.0.1 as local ...
371
  if (geoip_detect_is_ip_equal($ip, '127.0.0.0/8'))
372
  return false;
@@ -385,11 +406,11 @@ function geoip_detect_is_public_ip($ip) {
385
  return $is_public;
386
  }
387
 
388
- function geoip_detect_is_internal_ip($ip) {
389
  return geoip_detect_is_ip($ip) && !geoip_detect_is_public_ip($ip);
390
  }
391
 
392
- function _geoip_detect2_get_external_ip_services($nb = 3, $needsCORS = false) {
393
  $ipservicesThatAllowCORS = array(
394
  'http://ipv4.icanhazip.com',
395
  'http://v4.ident.me',
@@ -418,7 +439,7 @@ function _geoip_detect2_get_external_ip_services($nb = 3, $needsCORS = false) {
418
  *
419
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
420
  */
421
- function _geoip_detect_get_external_ip_adress_without_cache()
422
  {
423
  $ipservices = _geoip_detect2_get_external_ip_services();
424
 
@@ -482,7 +503,7 @@ function geoip_detect_get_relative_path($from, $to)
482
  return implode('/', $relPath);
483
  }
484
 
485
- function _geoip_maybe_disable_pagecache() {
486
  if (!get_option('geoip-detect-disable_pagecache'))
487
  return false;
488
 
@@ -503,7 +524,7 @@ function _geoip_maybe_disable_pagecache() {
503
  return true;
504
  }
505
 
506
- function _geoip_dashes_to_camel_case($string, $capitalizeFirstCharacter = false) {
507
  $str = str_replace(' ', '', ucwords(str_replace('_', ' ', $string)));
508
 
509
  if (!$capitalizeFirstCharacter) {
@@ -513,7 +534,7 @@ function _geoip_dashes_to_camel_case($string, $capitalizeFirstCharacter = false)
513
  return $str;
514
  }
515
 
516
- function geoip_detect_format_localtime($timestamp = -1) {
517
  if ($timestamp === -1) {
518
  $timestamp = time();
519
  }
@@ -526,13 +547,13 @@ function geoip_detect_format_localtime($timestamp = -1) {
526
  return get_date_from_gmt ( date( 'Y-m-d H:i:s', $timestamp ), $format);
527
  }
528
 
529
- function _geoip_str_begins_with($string, $startString)
530
  {
531
  $len = mb_strlen($startString);
532
  return (mb_substr($string, 0, $len) === $startString);
533
  }
534
 
535
- function _geoip_str_ends_with($string, $startString)
536
  {
537
  $len = mb_strlen($startString);
538
  //if ($len === 0) return true; // Not sure what is "expected behavior"
111
  return $reader;
112
  }
113
 
114
+ function _ip_to_s($ip) : string {
115
  $binary = '';
116
  try {
117
  $binary = @inet_pton($ip);
165
 
166
  function _geoip_detect2_empty_cache() {
167
  // This does not work for memcache. But it doesn't hurt either
 
168
  global $wpdb;
169
 
170
  $wpdb->query( "DELETE FROM `$wpdb->options` WHERE `option_name` LIKE ('_transient_geoip_detect_c_%')" );
171
+ return true;
172
  }
173
 
174
+ /**
175
+ * @return \GeoIp2\Model\Country
176
+ */
177
  function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
178
  $record = null;
179
 
202
  $error = 'No reader was found. Check if the configuration is complete and correct.';
203
  }
204
 
205
+ if (is_null($record)) {
206
+ return _geoip_detect2_get_new_empty_record();
207
+ }
208
+
209
  return $record;
210
  }
211
 
212
+ function _geoip_detect2_get_new_empty_record($ip = '') {
213
  $data = array('traits' => array('ip_address' => $ip), 'is_empty' => true);
214
+ return new \GeoIp2\Model\City($data);
215
+ }
216
+
217
+ function _geoip_detect2_record_enrich_data($record, $ip, $sourceId, $error) : array {
218
  if (is_object($record) && method_exists($record, 'jsonSerialize')) {
219
  $data = $record->jsonSerialize();
220
+ } else {
221
+ $data = array('traits' => array('ip_address' => $ip), 'is_empty' => true);
222
+ }
223
+
224
+ if (!isset($data['is_empty'])) {
225
  $data['is_empty'] = false;
226
  }
227
+
228
+ if (empty($data['traits']['ip_address'])) {
229
+ $data['traits']['ip_address'] = $ip;
230
+ }
231
+
232
  $data['extra']['source'] = $sourceId;
233
  $data['extra']['cached'] = 0;
234
 
260
  return $data;
261
 
262
  if (!function_exists('_geoip_detect_get_time_zone')) {
263
+ require_once(GEOIP_PLUGIN_DIR . '/lib/timezone.php');
264
  }
265
 
266
  if (!empty($data['country']['iso_code'])) {
308
  * IPv6-Adresses can be written in different formats. Make sure they are standardized.
309
  * For IPv4-Adresses, spaces are removed.
310
  */
311
+ function geoip_detect_normalize_ip(string $ip) : string {
312
  $ip = trim($ip);
313
  $binary = '';
314
  try {
321
  return $ip;
322
  }
323
 
324
+ function geoip_detect_sanitize_ip_list(string $ip_list) : string {
325
  $list = explode(',', $ip_list);
326
  $ret = array();
327
  foreach ($list as $ip) {
349
  * @param string|array $expected IP (can include subnet)
350
  * @return boolean
351
  */
352
+ function geoip_detect_is_ip_equal(string $actual, $expected) : bool {
353
  try {
354
  return IpUtils::checkIp($actual, $expected);
355
  } catch(\Exception $e) {
363
  }
364
  }
365
 
366
+ function geoip_detect_is_ip(string $ip, bool $noIpv6 = false) : bool {
367
  $flags = FILTER_FLAG_IPV4;
368
 
369
  if (GEOIP_DETECT_IPV6_SUPPORTED && !$noIpv6)
372
  return filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
373
  }
374
 
375
+ function geoip_detect_is_ip_in_range(string $ip, string $range_start, string $range_end) : bool {
376
  $long_ip = ip2long($ip);
377
  if ($long_ip === false) // Not IPv4
378
  return false;
387
  * @param string $ip IP (IPv4 or IPv6)
388
  * @return boolean TRUE if private
389
  */
390
+ function geoip_detect_is_public_ip(string $ip) : bool {
391
  // filver_var only detects 127.0.0.1 as local ...
392
  if (geoip_detect_is_ip_equal($ip, '127.0.0.0/8'))
393
  return false;
406
  return $is_public;
407
  }
408
 
409
+ function geoip_detect_is_internal_ip(string $ip) : bool {
410
  return geoip_detect_is_ip($ip) && !geoip_detect_is_public_ip($ip);
411
  }
412
 
413
+ function _geoip_detect2_get_external_ip_services(int $nb = 3, bool $needsCORS = false) : array {
414
  $ipservicesThatAllowCORS = array(
415
  'http://ipv4.icanhazip.com',
416
  'http://v4.ident.me',
439
  *
440
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
441
  */
442
+ function _geoip_detect_get_external_ip_adress_without_cache() : string
443
  {
444
  $ipservices = _geoip_detect2_get_external_ip_services();
445
 
503
  return implode('/', $relPath);
504
  }
505
 
506
+ function _geoip_maybe_disable_pagecache() : bool {
507
  if (!get_option('geoip-detect-disable_pagecache'))
508
  return false;
509
 
524
  return true;
525
  }
526
 
527
+ function _geoip_dashes_to_camel_case(string $string, bool $capitalizeFirstCharacter = false) : string {
528
  $str = str_replace(' ', '', ucwords(str_replace('_', ' ', $string)));
529
 
530
  if (!$capitalizeFirstCharacter) {
534
  return $str;
535
  }
536
 
537
+ function geoip_detect_format_localtime($timestamp = -1) : string {
538
  if ($timestamp === -1) {
539
  $timestamp = time();
540
  }
547
  return get_date_from_gmt ( date( 'Y-m-d H:i:s', $timestamp ), $format);
548
  }
549
 
550
+ function _geoip_str_begins_with($string, $startString) : bool
551
  {
552
  $len = mb_strlen($startString);
553
  return (mb_substr($string, 0, $len) === $startString);
554
  }
555
 
556
+ function _geoip_str_ends_with($string, $startString) : bool
557
  {
558
  $len = mb_strlen($startString);
559
  //if ($len === 0) return true; // Not sure what is "expected behavior"
geoip-detect.php CHANGED
@@ -5,18 +5,18 @@ Plugin URI: http://www.yellowtree.de
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
- Version: 3.3.0
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
12
  Domain Path: /languages
13
  GitHub Plugin URI: https://github.com/yellowtree/geoip-detect
14
  GitHub Branch: master
15
- Requires WP: 4.0
16
- Requires PHP: 5.6
17
  */
18
 
19
- define('GEOIP_DETECT_VERSION', '3.3.0');
20
 
21
  /*
22
  Copyright 2013-2021 Yellow Tree, Siegen, Germany
@@ -37,11 +37,14 @@ along with this program; if not, write to the Free Software
37
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
38
  */
39
 
40
- define('GEOIP_REQUIRED_PHP_VERSION', '5.6');
41
 
42
- // In theory, it should still run in 3.5 . But officially supported is only WP 4.0 and above.
43
  define('GEOIP_REQUIRED_WP_VERSION', '3.5');
44
 
 
 
 
45
  define('GEOIP_PLUGIN_FILE', __FILE__);
46
  define('GEOIP_PLUGIN_DIR', dirname(GEOIP_PLUGIN_FILE));
47
  define('GEOIP_PLUGIN_BASENAME', plugin_basename(GEOIP_PLUGIN_FILE));
@@ -54,6 +57,11 @@ if (!geoip_detect_version_check()) {
54
  require_once(GEOIP_PLUGIN_DIR . '/api-stubs.php');
55
  return; // Do nothing except emitting the admin notice
56
  }
 
 
 
 
 
57
 
58
  require_once(GEOIP_PLUGIN_DIR . '/vendor/autoload.php');
59
  require_once(GEOIP_PLUGIN_DIR . '/init.php');
@@ -69,7 +77,7 @@ require_once(GEOIP_PLUGIN_DIR . '/api.php');
69
  require_once(GEOIP_PLUGIN_DIR . '/legacy-api.php');
70
  require_once(GEOIP_PLUGIN_DIR . '/deprecated.php');
71
  require_once(GEOIP_PLUGIN_DIR . '/filter.php');
72
- require_once(GEOIP_PLUGIN_DIR . '/shortcode.php');
73
  require_once(GEOIP_PLUGIN_DIR . '/ajax.php');
74
 
75
  require_once(GEOIP_PLUGIN_DIR . '/data-sources/registry.php');
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
+ Version: 4.0.0
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
12
  Domain Path: /languages
13
  GitHub Plugin URI: https://github.com/yellowtree/geoip-detect
14
  GitHub Branch: master
15
+ Requires WP: 5.0
16
+ Requires PHP: 7.2.5
17
  */
18
 
19
+ define('GEOIP_DETECT_VERSION', '4.0.0');
20
 
21
  /*
22
  Copyright 2013-2021 Yellow Tree, Siegen, Germany
37
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
38
  */
39
 
40
+ define('GEOIP_REQUIRED_PHP_VERSION', '7.2.5');
41
 
42
+ // In theory, it should still run in 3.5 . But officially supported is only WP 5.0 and above.
43
  define('GEOIP_REQUIRED_WP_VERSION', '3.5');
44
 
45
+ // We need this requirement because WooCommerce hardcoded Maxmind code instead of using composer. This would result in an PHP fatal error when there is a lookup.
46
+ define('GEOIP_REQUIRED_WOOCOMMERCE_VERSION', '3.9.0');
47
+
48
  define('GEOIP_PLUGIN_FILE', __FILE__);
49
  define('GEOIP_PLUGIN_DIR', dirname(GEOIP_PLUGIN_FILE));
50
  define('GEOIP_PLUGIN_BASENAME', plugin_basename(GEOIP_PLUGIN_FILE));
57
  require_once(GEOIP_PLUGIN_DIR . '/api-stubs.php');
58
  return; // Do nothing except emitting the admin notice
59
  }
60
+ add_action('plugins_loaded', function() {
61
+ if (!geoip_detect_version_check_after_plugins_loaded()) {
62
+ define('GEOIP_DETECT_LOOKUP_DISABLED', true);
63
+ }
64
+ });
65
 
66
  require_once(GEOIP_PLUGIN_DIR . '/vendor/autoload.php');
67
  require_once(GEOIP_PLUGIN_DIR . '/init.php');
77
  require_once(GEOIP_PLUGIN_DIR . '/legacy-api.php');
78
  require_once(GEOIP_PLUGIN_DIR . '/deprecated.php');
79
  require_once(GEOIP_PLUGIN_DIR . '/filter.php');
80
+ require_once(GEOIP_PLUGIN_DIR . '/api_shortcodes.php');
81
  require_once(GEOIP_PLUGIN_DIR . '/ajax.php');
82
 
83
  require_once(GEOIP_PLUGIN_DIR . '/data-sources/registry.php');
js/body_classes.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { domReady } from './lib/html';
2
+ import { get_info } from './lookup';
3
+
4
+ export async function add_body_classes() {
5
+ const record = await get_info();
6
+
7
+ if (record.error()) {
8
+ console.error('Geodata Error (could not add CSS-classes to body): ' + record.error());
9
+ return;
10
+ }
11
+
12
+ const css_classes = {
13
+ country: record.get('country.iso_code'),
14
+ 'country-is-in-european-union': record.has_property('country.is_in_european_union') && record.get('country.is_in_european_union'),
15
+ continent: record.get('continent.code'),
16
+ province: record.get('most_specific_subdivision.iso_code'),
17
+ };
18
+
19
+ await domReady;
20
+
21
+ const body = document.getElementsByTagName('body')[0];
22
+ for (let key of Object.keys(css_classes)) {
23
+ const value = css_classes[key];
24
+ if (value) {
25
+ if (typeof (value) == 'string') {
26
+ body.classList.add(`geoip-${key}-${value}`);
27
+ } else {
28
+ body.classList.add(`geoip-${key}`);
29
+ }
30
+ }
31
+ }
32
+ }
js/dist/frontend.2e78f904.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"LNzP":[function(require,module,exports) {
2
+ function o(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?module.exports=o=function(o){return typeof o}:module.exports=o=function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},o(t)}module.exports=o;
3
+ },{}],"KA2S":[function(require,module,exports) {
4
+ var define;
5
+ var t,r=function(t){"use strict";var r,e=Object.prototype,n=e.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function u(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{u({},"")}catch(P){u=function(t,r,e){return t[r]=e}}function h(t,r,e,n){var o=r&&r.prototype instanceof d?r:d,i=Object.create(o.prototype),a=new G(n||[]);return i._invoke=function(t,r,e){var n=l;return function(o,i){if(n===p)throw new Error("Generator is already running");if(n===y){if("throw"===o)throw i;return F()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var c=j(a,e);if(c){if(c===v)continue;return c}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===l)throw n=y,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=p;var u=f(t,r,e);if("normal"===u.type){if(n=e.done?y:s,u.arg===v)continue;return{value:u.arg,done:e.done}}"throw"===u.type&&(n=y,e.method="throw",e.arg=u.arg)}}}(t,e,a),i}function f(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(P){return{type:"throw",arg:P}}}t.wrap=h;var l="suspendedStart",s="suspendedYield",p="executing",y="completed",v={};function d(){}function g(){}function m(){}var w={};w[i]=function(){return this};var L=Object.getPrototypeOf,x=L&&L(L(N([])));x&&x!==e&&n.call(x,i)&&(w=x);var b=m.prototype=d.prototype=Object.create(w);function E(t){["next","throw","return"].forEach(function(r){u(t,r,function(t){return this._invoke(r,t)})})}function _(t,r){var e;this._invoke=function(o,i){function a(){return new r(function(e,a){!function e(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var h=u.arg,l=h.value;return l&&"object"==typeof l&&n.call(l,"__await")?r.resolve(l.__await).then(function(t){e("next",t,a,c)},function(t){e("throw",t,a,c)}):r.resolve(l).then(function(t){h.value=t,a(h)},function(t){return e("throw",t,a,c)})}c(u.arg)}(o,i,e,a)})}return e=e?e.then(a,a):a()}}function j(t,e){var n=t.iterator[e.method];if(n===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=r,j(t,e),"throw"===e.method))return v;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var o=f(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,v;var i=o.arg;return i?i.done?(e[t.resultName]=i.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,v):i:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,v)}function O(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function k(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function G(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(O,this),this.reset(!0)}function N(t){if(t){var e=t[i];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function e(){for(;++o<t.length;)if(n.call(t,o))return e.value=t[o],e.done=!1,e;return e.value=r,e.done=!0,e};return a.next=a}}return{next:F}}function F(){return{value:r,done:!0}}return g.prototype=b.constructor=m,m.constructor=g,g.displayName=u(m,c,"GeneratorFunction"),t.isGeneratorFunction=function(t){var r="function"==typeof t&&t.constructor;return!!r&&(r===g||"GeneratorFunction"===(r.displayName||r.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,m):(t.__proto__=m,u(t,c,"GeneratorFunction")),t.prototype=Object.create(b),t},t.awrap=function(t){return{__await:t}},E(_.prototype),_.prototype[a]=function(){return this},t.AsyncIterator=_,t.async=function(r,e,n,o,i){void 0===i&&(i=Promise);var a=new _(h(r,e,n,o),i);return t.isGeneratorFunction(e)?a:a.next().then(function(t){return t.done?t.value:a.next()})},E(b),u(b,c,"Generator"),b[i]=function(){return this},b.toString=function(){return"[object Generator]"},t.keys=function(t){var r=[];for(var e in t)r.push(e);return r.reverse(),function e(){for(;r.length;){var n=r.pop();if(n in t)return e.value=n,e.done=!1,e}return e.done=!0,e}},t.values=N,G.prototype={constructor:G,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=r,this.done=!1,this.delegate=null,this.method="next",this.arg=r,this.tryEntries.forEach(k),!t)for(var e in this)"t"===e.charAt(0)&&n.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=r)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function o(n,o){return c.type="throw",c.arg=t,e.next=n,o&&(e.method="next",e.arg=r),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),h=n.call(a,"finallyLoc");if(u&&h){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!h)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,r){for(var e=this.tryEntries.length-1;e>=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=r&&r<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=r,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(a)},complete:function(t,r){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&r&&(this.next=r),v},finish:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),k(e),v}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;k(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:N(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),v}},t}("object"==typeof module?module.exports:{});try{regeneratorRuntime=r}catch(e){Function("r","regeneratorRuntime = r")(r)}
6
+ },{}],"m4eR":[function(require,module,exports) {
7
+ module.exports=require("regenerator-runtime");
8
+ },{"regenerator-runtime":"KA2S"}],"fwsn":[function(require,module,exports) {
9
+ function n(n,t,o,r,e,i,u){try{var c=n[i](u),v=c.value}catch(a){return void o(a)}c.done?t(v):Promise.resolve(v).then(r,e)}function t(t){return function(){var o=this,r=arguments;return new Promise(function(e,i){var u=t.apply(o,r);function c(t){n(u,e,i,c,v,"next",t)}function v(t){n(u,e,i,c,v,"throw",t)}c(void 0)})}}module.exports=t;
10
+ },{}],"ZBnv":[function(require,module,exports) {
11
+ function n(n,o){if(!(n instanceof o))throw new TypeError("Cannot call a class as a function")}module.exports=n;
12
+ },{}],"NoOd":[function(require,module,exports) {
13
+ function e(e,r){for(var n=0;n<r.length;n++){var t=r[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}function r(r,n,t){return n&&e(r.prototype,n),t&&e(r,t),r}module.exports=r;
14
+ },{}],"AuD4":[function(require,module,exports) {
15
+ var global = arguments[3];
16
+ var define;
17
+ var t,n=arguments[3],r=e(require("@babel/runtime/helpers/typeof"));function e(t){return t&&t.__esModule?t:{default:t}}(function(){var e,u="Expected a function",o="__lodash_hash_undefined__",i=500,a=800,c=16,f=1/0,l=9007199254740991,s="[object AsyncFunction]",h="[object Function]",p="[object GeneratorFunction]",_="[object Null]",d="[object Proxy]",y="[object Symbol]",v="[object Undefined]",g=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,b=/^\w*$/,j=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,m=/\\(\\)?/g,O=/^\[object .+?Constructor\]$/,w="object"==(void 0===n?"undefined":(0,r.default)(n))&&n&&n.Object===Object&&n,z="object"==("undefined"==typeof self?"undefined":(0,r.default)(self))&&self&&self.Object===Object&&self,A=w||z||Function("return this")(),x="object"==("undefined"==typeof exports?"undefined":(0,r.default)(exports))&&exports&&!exports.nodeType&&exports,S=x&&"object"==("undefined"==typeof module?"undefined":(0,r.default)(module))&&module&&!module.nodeType&&module;function $(t,n){return!!(null==t?0:t.length)&&function(t,n,r){return n==n?function(t,n,r){var e=r-1,u=t.length;for(;++e<u;)if(t[e]===n)return e;return-1}(t,n,r):function(t,n,r,e){var u=t.length,o=r+(e?1:-1);for(;e?o--:++o<u;)if(n(t[o],o,t))return o;return-1}(t,E,r)}(t,n,0)>-1}function F(t,n,r){for(var e=-1,u=null==t?0:t.length;++e<u;)if(r(n,t[e]))return!0;return!1}function k(t,n){for(var r=-1,e=null==t?0:t.length,u=Array(e);++r<e;)u[r]=n(t[r],r,t);return u}function E(t){return t!=t}function P(t){return function(n){return t(n)}}function T(t,n){return t.has(n)}var C,L=Array.prototype,M=Function.prototype,R=Object.prototype,q=A["__core-js_shared__"],I=M.toString,N=R.hasOwnProperty,D=(C=/[^.]+$/.exec(q&&q.keys&&q.keys.IE_PROTO||""))?"Symbol(src)_1."+C:"",G=R.toString,U=RegExp("^"+I.call(N).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),V=A.Symbol,B=L.splice,H=V?V.toStringTag:e,J=function(){try{var t=pt(Object,"defineProperty");return t({},"",{}),t}catch(n){}}(),K=Math.max,Q=Math.min,W=Date.now,X=pt(A,"Map"),Y=pt(Object,"create"),Z=V?V.prototype:e,tt=Z?Z.toString:e;function nt(){}function rt(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function et(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ut(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ot(t){var n=-1,r=null==t?0:t.length;for(this.__data__=new ut;++n<r;)this.add(t[n])}function it(t,n){for(var r=t.length;r--;)if(Ot(t[r][0],n))return r;return-1}function at(t,n){for(var u=0,o=(n=function(t,n){if(wt(t))return t;return function(t,n){if(wt(t))return!1;var e=(0,r.default)(t);if("number"==e||"symbol"==e||"boolean"==e||null==t||kt(t))return!0;return b.test(t)||!g.test(t)||null!=n&&t in Object(n)}(t,n)?[t]:gt(Et(t))}(n,t)).length;null!=t&&u<o;)t=t[bt(n[u++])];return u&&u==o?t:e}function ct(t){return null==t?t===e?v:_:H&&H in Object(t)?function(t){var n=N.call(t,H),r=t[H];try{t[H]=e;var u=!0}catch(i){}var o=G.call(t);u&&(n?t[H]=r:delete t[H]);return o}(t):function(t){return G.call(t)}(t)}function ft(t){return!(!$t(t)||(n=t,D&&D in n))&&(xt(t)?U:O).test(function(t){if(null!=t){try{return I.call(t)}catch(n){}try{return t+""}catch(n){}}return""}(t));var n}function lt(t){if("string"==typeof t)return t;if(wt(t))return k(t,lt)+"";if(kt(t))return tt?tt.call(t):"";var n=t+"";return"0"==n&&1/t==-f?"-0":n}function st(t){return At(t)?t:[]}function ht(t,n){var e,u,o=t.__data__;return e=n,("string"==(u=(0,r.default)(e))||"number"==u||"symbol"==u||"boolean"==u?"__proto__"!==e:null===e)?o["string"==typeof n?"string":"hash"]:o.map}function pt(t,n){var r=function(t,n){return null==t?e:t[n]}(t,n);return ft(r)?r:e}rt.prototype.clear=function(){this.__data__=Y?Y(null):{},this.size=0},rt.prototype.delete=function(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n},rt.prototype.get=function(t){var n=this.__data__;if(Y){var r=n[t];return r===o?e:r}return N.call(n,t)?n[t]:e},rt.prototype.has=function(t){var n=this.__data__;return Y?n[t]!==e:N.call(n,t)},rt.prototype.set=function(t,n){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Y&&n===e?o:n,this},et.prototype.clear=function(){this.__data__=[],this.size=0},et.prototype.delete=function(t){var n=this.__data__,r=it(n,t);return!(r<0||(r==n.length-1?n.pop():B.call(n,r,1),--this.size,0))},et.prototype.get=function(t){var n=this.__data__,r=it(n,t);return r<0?e:n[r][1]},et.prototype.has=function(t){return it(this.__data__,t)>-1},et.prototype.set=function(t,n){var r=this.__data__,e=it(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this},ut.prototype.clear=function(){this.size=0,this.__data__={hash:new rt,map:new(X||et),string:new rt}},ut.prototype.delete=function(t){var n=ht(this,t).delete(t);return this.size-=n?1:0,n},ut.prototype.get=function(t){return ht(this,t).get(t)},ut.prototype.has=function(t){return ht(this,t).has(t)},ut.prototype.set=function(t,n){var r=ht(this,t),e=r.size;return r.set(t,n),this.size+=r.size==e?0:1,this},ot.prototype.add=ot.prototype.push=function(t){return this.__data__.set(t,o),this},ot.prototype.has=function(t){return this.__data__.has(t)};var _t,dt,yt,vt=(_t=J?function(t,n){return J(t,"toString",{configurable:!0,enumerable:!1,value:Pt(n),writable:!0})}:Tt,dt=0,yt=0,function(){var t=W(),n=c-(t-yt);if(yt=t,n>0){if(++dt>=a)return arguments[0]}else dt=0;return _t.apply(e,arguments)});var gt=function(t){var n=mt(t,function(t){return r.size===i&&r.clear(),t}),r=n.cache;return n}(function(t){var n=[];return 46===t.charCodeAt(0)&&n.push(""),t.replace(j,function(t,r,e,u){n.push(e?u.replace(m,"$1"):r||t)}),n});function bt(t){if("string"==typeof t||kt(t))return t;var n=t+"";return"0"==n&&1/t==-f?"-0":n}var jt=function(t,n){return vt(function(t,n,r){return n=K(n===e?t.length-1:n,0),function(){for(var e=arguments,u=-1,o=K(e.length-n,0),i=Array(o);++u<o;)i[u]=e[n+u];u=-1;for(var a=Array(n+1);++u<n;)a[u]=e[u];return a[n]=r(i),function(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}(t,this,a)}}(t,n,Tt),t+"")}(function(t){var n=k(t,st);return n.length&&n[0]===t[0]?function(t,n,r){for(var u=r?F:$,o=t[0].length,i=t.length,a=i,c=Array(i),f=1/0,l=[];a--;){var s=t[a];a&&n&&(s=k(s,P(n))),f=Q(s.length,f),c[a]=!r&&(n||o>=120&&s.length>=120)?new ot(a&&s):e}s=t[0];var h=-1,p=c[0];t:for(;++h<o&&l.length<f;){var _=s[h],d=n?n(_):_;if(_=r||0!==_?_:0,!(p?T(p,d):u(l,d,r))){for(a=i;--a;){var y=c[a];if(!(y?T(y,d):u(t[a],d,r)))continue t}p&&p.push(d),l.push(_)}}return l}(n):[]});function mt(t,n){if("function"!=typeof t||null!=n&&"function"!=typeof n)throw new TypeError(u);var r=function r(){var e=arguments,u=n?n.apply(this,e):e[0],o=r.cache;if(o.has(u))return o.get(u);var i=t.apply(this,e);return r.cache=o.set(u,i)||o,i};return r.cache=new(mt.Cache||ut),r}function Ot(t,n){return t===n||t!=t&&n!=n}mt.Cache=ut;var wt=Array.isArray;function zt(t){return null!=t&&St(t.length)&&!xt(t)}function At(t){return Ft(t)&&zt(t)}function xt(t){if(!$t(t))return!1;var n=ct(t);return n==h||n==p||n==s||n==d}function St(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=l}function $t(t){var n=(0,r.default)(t);return null!=t&&("object"==n||"function"==n)}function Ft(t){return null!=t&&"object"==(0,r.default)(t)}function kt(t){return"symbol"==(0,r.default)(t)||Ft(t)&&ct(t)==y}function Et(t){return null==t?"":lt(t)}function Pt(t){return function(){return t}}function Tt(t){return t}nt.constant=Pt,nt.intersection=jt,nt.memoize=mt,nt.eq=Ot,nt.get=function(t,n,r){var u=null==t?e:at(t,n);return u===e?r:u},nt.identity=Tt,nt.isArray=wt,nt.isArrayLike=zt,nt.isArrayLikeObject=At,nt.isFunction=xt,nt.isLength=St,nt.isObject=$t,nt.isObjectLike=Ft,nt.isSymbol=kt,nt.toString=Et,nt.VERSION="4.17.5","function"==typeof t&&"object"==(0,r.default)(t.amd)&&t.amd?(A._=nt,t(function(){return nt})):S?((S.exports=nt)._=nt,x._=nt):A._=nt}).call(void 0);
18
+ },{"@babel/runtime/helpers/typeof":"LNzP"}],"yK6K":[function(require,module,exports) {
19
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.camelToUnderscore=void 0;var e=o(require("@babel/runtime/helpers/classCallCheck")),t=o(require("@babel/runtime/helpers/createClass")),r=o(require("@babel/runtime/helpers/typeof")),a=o(require("../lodash.custom"));function o(e){return e&&e.__esModule?e:{default:e}}var l=function(e,t){if("object"===(0,r.default)(e)){if("string"==typeof t&&(t=[t]),"object"!==(0,r.default)(t)&&(t=[]),"object"===(0,r.default)(e.names))for(var a=0;a<t.length;a++){var o=t[a];if(e.names[o])return e.names[o]}if(e.name)return e.name}return e},u=function(e){return e.replace(/(?<=[a-z0-9])([A-Z])/g,"_$1").toLowerCase()};exports.camelToUnderscore=u;var n=function(){function o(t,r){(0,e.default)(this,o),this.data={},this.default_locales=[],this.data=t||{},this.default_locales=r||["en"]}return(0,t.default)(o,[{key:"get",value:function(e,t){return this.get_with_locales(e,null,t)}},{key:"get_raw",value:function(e){return e=u(e),a.default.get(this.data,e,null)}},{key:"has_property",value:function(e){return void 0!==this._lookup_with_locales(e,this.default_locales)}},{key:"_lookup_with_locales",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";".name"===(e=u(e)).substr(-5)&&(e=e.substr(0,e.length-5));var o=a.default.get(this.data,e,r);return o=l(o,t)}},{key:"get_with_locales",value:function(e,t,a){Array.isArray(t)&&0!==t.length||(t=this.default_locales);var o=this._lookup_with_locales(e,t,a);return"object"===(0,r.default)(o)&&console.warn('Geolocation IP Detection: The property "'+e+'" is of type "'+(0,r.default)(o)+'", should be string or similar',o),void 0===o?(console.warn('Geolocation IP Detection: The property "'+e+'" is not defined, please check spelling or maybe you need a different data source',{data:this.data}),""):o}},{key:"get_country_iso",value:function(){var e=this.get("country.iso_code");return e&&(e=e.substr(0,2).toLowerCase()),e}},{key:"error",value:function(){return a.default.get(this.data,"extra.error","")}},{key:"serialize",value:function(){return this.data}}]),o}(),s=n;exports.default=s;
20
+ },{"@babel/runtime/helpers/classCallCheck":"ZBnv","@babel/runtime/helpers/createClass":"NoOd","@babel/runtime/helpers/typeof":"LNzP","../lodash.custom":"AuD4"}],"VVpI":[function(require,module,exports) {
21
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getLocalStorage=exports.setLocalStorage=void 0;var e=function(e,t,r){var a={value:t,expires_at:(new Date).getTime()+1e3*r/1};localStorage.setItem(e.toString(),JSON.stringify(a))};exports.setLocalStorage=e;var t=function(e){var t=null;try{t=JSON.parse(localStorage.getItem(e.toString()))}catch(r){return null}if(null!==t){if(!(null!==t.expires_at&&t.expires_at<(new Date).getTime()))return t.value;localStorage.removeItem(e.toString())}return null};exports.getLocalStorage=t;
22
+ },{}],"jf5f":[function(require,module,exports) {
23
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.makeJSONRequest=exports.makeRequest=void 0;var e=r(require("@babel/runtime/regenerator")),t=r(require("@babel/runtime/helpers/asyncToGenerator"));function r(e){return e&&e.__esModule?e:{default:e}}var n=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"GET",r=new XMLHttpRequest;return new Promise(function(n,u){r.onreadystatechange=function(){4===r.readyState&&(r.status>=200&&r.status<300?n(r):u({status:r.status,statusText:r.statusText,request:r}))},r.open(t||"GET",e,!0),r.send()})};exports.makeRequest=n;var u=function(e){try{return JSON.parse(e)}catch(t){return e}},s=function(){var r=(0,t.default)(e.default.mark(function t(r){var s,a,o=arguments;return e.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=o.length>1&&void 0!==o[1]?o[1]:"GET",e.prev=1,e.next=4,n(r,s);case 4:return a=e.sent,e.abrupt("return",u(a.responseText));case 8:return e.prev=8,e.t0=e.catch(1),e.abrupt("return",u(e.t0.request.responseText));case 11:case"end":return e.stop()}},t,null,[[1,8]])}));return function(e){return r.apply(this,arguments)}}();exports.makeJSONRequest=s;
24
+ },{"@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn"}],"yyFn":[function(require,module,exports) {
25
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.set_override=_,exports.remove_override=x,exports.get_info=m,exports.options=void 0;var e,r=s(require("@babel/runtime/helpers/typeof")),t=s(require("@babel/runtime/regenerator")),o=s(require("@babel/runtime/helpers/asyncToGenerator")),n=s(require("./models/record")),a=require("./lib/localStorageAccess"),i=s(require("./lodash.custom")),u=require("./lib/xhr");function s(e){return e&&e.__esModule?e:{default:e}}var c=(null===(e=window.geoip_detect)||void 0===e?void 0:e.options)||{ajaxurl:"/wp-admin/admin-ajax.php",default_locales:["en"],cookie_duration_in_days:7,cookie_name:"geoip-detect-result"};exports.options=c;var l=null;function d(){if(!l){var e=c.ajaxurl+"?action=geoip_detect2_get_info_from_current_ip";l=(0,u.makeJSONRequest)(e)}return l}function p(){return f.apply(this,arguments)}function f(){return(f=(0,o.default)(t.default.mark(function e(){var r,o,n,i;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(r=!1,o=!1,!c.cookie_name){e.next=6;break}if(!(o=(0,a.getLocalStorage)(c.cookie_name))||!o.extra){e.next=6;break}return e.abrupt("return",o);case 6:return e.prev=6,e.next=9,d();case 9:r=e.sent,e.next=15;break;case 12:e.prev=12,e.t0=e.catch(6),r=e.t0.responseJSON||e.t0;case 15:if(!c.cookie_name){e.next=20;break}if(o=(0,a.getLocalStorage)(c.cookie_name),!0!==(null===(n=o)||void 0===n?void 0:null===(i=n.extra)||void 0===i?void 0:i.override)){e.next=19;break}return e.abrupt("return",o);case 19:(0,a.setLocalStorage)(c.cookie_name,r,24*c.cookie_duration_in_days*60*60);case 20:return e.abrupt("return",r);case 21:case"end":return e.stop()}},e,null,[[6,12]])}))).apply(this,arguments)}function _(e,r){return e&&"function"==typeof e.serialize&&(e=e.serialize()),(r=r||c.cookie_duration_in_days)<0?(console.warn("set_override_data() did nothing: A negative duration doesn't make sense. If you want to remove the override, use remove_override() instead."),!1):v(e,r)}function v(e,r){return e||(e={}),e.extra||(e.extra={}),e.extra.override=!0,(0,a.setLocalStorage)(c.cookie_name,e,24*r*60*60),!0}function x(){return(0,a.setLocalStorage)(c.cookie_name,{},-1),!0}function m(){return k.apply(this,arguments)}function k(){return(k=(0,o.default)(t.default.mark(function e(){var o,a;return t.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p();case 2:return o=e.sent,"object"!==(0,r.default)(o)&&(console.error("Geoip-detect: Record should be an object, not a "+(0,r.default)(o),o),o={extra:{error:o||"Network error, look at the original server response ..."}}),a=new n.default(o,c.default_locales),e.abrupt("return",a);case 6:case"end":return e.stop()}},e)}))).apply(this,arguments)}
26
+ },{"@babel/runtime/helpers/typeof":"LNzP","@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn","./models/record":"yK6K","./lib/localStorageAccess":"VVpI","./lodash.custom":"AuD4","./lib/xhr":"jf5f"}],"YIwO":[function(require,module,exports) {
27
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.selectItemByValue=t,exports.selectItemByAttribute=n,exports.triggerNativeEvent=o,exports.domReady=void 0;var e=new Promise(function(e){"loading"===document.readyState?document.addEventListener?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&e()}):e()});function t(e,t){for(var n=0;n<e.options.length;n++)if(e.options[n].value===t){e.selectedIndex=n;break}}function n(e,t,n){for(var o=0;o<e.options.length;o++)if(e.options[o].getAttribute(t)===n){e.selectedIndex=o;break}}function o(e,t){if(document.createEvent){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!1),e.dispatchEvent(n)}else e.fireEvent("on"+t)}exports.domReady=e;
28
+ },{}],"IyEz":[function(require,module,exports) {
29
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.get_options=o,exports.action_on_elements=a,exports.get_value_from_record=s;var e=n(require("@babel/runtime/regenerator")),r=n(require("@babel/runtime/helpers/asyncToGenerator")),t=require("../lookup");function n(e){return e&&e.__esModule?e:{default:e}}function o(e){var r=e.getAttribute("data-options");try{return JSON.parse(r)}catch(t){return{}}}function a(e,r,t){return u.apply(this,arguments)}function u(){return(u=(0,r.default)(e.default.mark(function r(n,o,a){var u,s;return e.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if((u=document.getElementsByClassName(n)).length){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,(0,t.get_info)();case 5:if(!(s=e.sent).error()){e.next=9;break}return console.error("Geolocation IP Detection Error ("+o+"): "+s.error()),e.abrupt("return");case 9:Array.from(u).forEach(function(e){return a(e,s)});case 10:case"end":return e.stop()}},r)}))).apply(this,arguments)}function s(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=o(e);return t=t||n.property,n.skip_cache&&console.warn("Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME."),r.get_with_locales(t,n.lang,n.default)}
30
+ },{"@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn","../lookup":"yyFn"}],"AwHB":[function(require,module,exports) {
31
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_normal=o,exports.do_shortcode_flags=r,exports.do_shortcode_country_select=_,exports.do_shortcode_text_input=c;var e=require("../lib/html"),t=require("./helpers");function o(e,o){e.innerText=(0,t.get_value_from_record)(e,o)}function r(e,o){var r=o.get_country_iso()||(0,t.get_options)(e).default;r&&e.classList.add("flag-icon-"+r)}function _(t,o){var r=o.get_country_iso();(0,e.selectItemByAttribute)(t,"data-c",r),(0,e.triggerNativeEvent)(t,"change")}function c(o,r){o.value=(0,t.get_value_from_record)(o,r),(0,e.triggerNativeEvent)(o,"change")}
32
+ },{"../lib/html":"YIwO","./helpers":"IyEz"}],"jiwS":[function(require,module,exports) {
33
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcode_show_if=r,exports.geoip_detect2_shortcode_evaluate_conditions=i;var e=n(require("@babel/runtime/helpers/typeof")),o=require("./helpers"),t=n(require("../lodash.custom"));function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=(0,o.get_options)(e),r=i(n.parsed,n,t);e.style.display=r?"":"none !important"}function i(o,t,n){var r=["name","iso_code","iso_code3","code","geoname_id"],i="or"!==o.op;return o.conditions.forEach(function(u){var a=!1,c=[],l=n.get_raw(u.p);null===l?a=!1:"object"===(0,e.default)(l)?r.forEach(function(e){l[e]?c.push(l[e]):"name"==e&&c.push(n.get_with_locales(u.p,t.lang))}):c=[l],a=s(u.v,c),u.not&&(a=!a),i="or"===o.op?i||a:i&&a}),o.not&&(i=!i),i}function s(e,o){return!0===o[0]?o=["true","yes","y","1"]:!1===o[0]&&(o=["false","no","n","0",""]),o=o.map(function(e){return String(e).toLowerCase()}),e=e.split(","),t.default.intersection(e,o).length>0}
34
+ },{"@babel/runtime/helpers/typeof":"LNzP","./helpers":"IyEz","../lodash.custom":"AuD4"}],"d5ii":[function(require,module,exports) {
35
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.do_shortcodes=void 0;var e=c(require("@babel/runtime/regenerator")),t=c(require("@babel/runtime/helpers/asyncToGenerator")),o=require("../lib/html"),r=require("./helpers"),n=require("./normal"),s=require("./show-if");function c(e){return e&&e.__esModule?e:{default:e}}var i=function(){var c=(0,t.default)(e.default.mark(function t(){return e.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,o.domReady;case 2:(0,r.action_on_elements)("js-geoip-detect-shortcode","could not execute shortcode(s) [geoip_detect2]",n.do_shortcode_normal),(0,r.action_on_elements)("js-geoip-detect-flag","could not configure the flag(s)",n.do_shortcode_flags),(0,r.action_on_elements)("js-geoip-text-input","could not set the value of the text input field(s)",n.do_shortcode_text_input),(0,r.action_on_elements)("js-geoip-detect-country-select","could not set the value of the select field(s)",n.do_shortcode_country_select),(0,r.action_on_elements)("js-geoip-detect-show-if","could not execute the show-if/hide-if conditions",s.do_shortcode_show_if);case 7:case"end":return e.stop()}},t)}));return function(){return c.apply(this,arguments)}}();exports.do_shortcodes=i;
36
+ },{"@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn","../lib/html":"YIwO","./helpers":"IyEz","./normal":"AwHB","./show-if":"jiwS"}],"EtfF":[function(require,module,exports) {
37
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.add_body_classes=s;var e=o(require("@babel/runtime/regenerator")),r=o(require("@babel/runtime/helpers/asyncToGenerator")),t=require("./lib/html"),n=require("./lookup");function o(e){return e&&e.__esModule?e:{default:e}}function s(){return a.apply(this,arguments)}function a(){return(a=(0,r.default)(e.default.mark(function r(){var o,s,a,u,i,c,d;return e.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,(0,n.get_info)();case 2:if(!(o=e.sent).error()){e.next=6;break}return console.error("Geodata Error (could not add CSS-classes to body): "+o.error()),e.abrupt("return");case 6:return s={country:o.get("country.iso_code"),"country-is-in-european-union":o.has_property("country.is_in_european_union")&&o.get("country.is_in_european_union"),continent:o.get("continent.code"),province:o.get("most_specific_subdivision.iso_code")},e.next=9,t.domReady;case 9:for(a=document.getElementsByTagName("body")[0],u=0,i=Object.keys(s);u<i.length;u++)c=i[u],(d=s[c])&&("string"==typeof d?a.classList.add("geoip-".concat(c,"-").concat(d)):a.classList.add("geoip-".concat(c)));case 11:case"end":return e.stop()}},r)}))).apply(this,arguments)}
38
+ },{"@babel/runtime/regenerator":"m4eR","@babel/runtime/helpers/asyncToGenerator":"fwsn","./lib/html":"YIwO","./lookup":"yyFn"}],"ZVsn":[function(require,module,exports) {
39
+ "use strict";var e=require("./lookup"),o=require("./shortcodes/index"),d=require("./body_classes");e.options.do_body_classes&&(0,d.add_body_classes)(),e.options.do_shortcodes&&(0,o.do_shortcodes)(),window.geoip_detect.get_info=e.get_info,window.geoip_detect.set_override=e.set_override,window.geoip_detect.remove_override=e.remove_override;
40
+ },{"./lookup":"yyFn","./shortcodes/index":"d5ii","./body_classes":"EtfF"}]},{},["ZVsn"], null)
41
+ //# sourceMappingURL=frontend.2e78f904.js.map
js/dist/frontend.2e78f904.js.map ADDED
@@ -0,0 +1 @@
 
1
+ {"version":3,"sources":["node_modules/@babel/runtime/helpers/typeof.js","node_modules/regenerator-runtime/runtime.js","node_modules/@babel/runtime/regenerator/index.js","node_modules/@babel/runtime/helpers/asyncToGenerator.js","node_modules/@babel/runtime/helpers/classCallCheck.js","node_modules/@babel/runtime/helpers/createClass.js","js/lodash.custom.js","js/models/record.js","js/lib/localStorageAccess.js","js/lib/xhr.js","js/lookup.js","js/lib/html.js","js/shortcodes/helpers.js","js/shortcodes/normal.js","js/shortcodes/show-if.js","js/shortcodes/index.js","js/body_classes.js","js/frontend.js"],"names":["undefined","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","HOT_COUNT","HOT_SPAN","INFINITY","MAX_SAFE_INTEGER","asyncTag","funcTag","genTag","nullTag","proxyTag","symbolTag","undefinedTag","reIsDeepProp","reIsPlainProp","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","arrayIncludes","array","value","length","baseIndexOf","fromIndex","strictIndexOf","index","baseFindIndex","predicate","fromRight","baseIsNaN","arrayIncludesWith","comparator","arrayMap","iteratee","result","Array","baseUnary","func","cacheHas","cache","key","has","arrayProto","uid","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","reIsNative","RegExp","call","replace","Symbol","splice","symToStringTag","toStringTag","defineProperty","getNative","e","nativeMax","Math","max","nativeMin","min","nativeNow","Date","now","Map","nativeCreate","symbolProto","symbolToString","lodash","Hash","entries","clear","entry","set","ListCache","MapCache","SetCache","values","__data__","add","assocIndexOf","eq","baseGet","object","path","castPath","isArray","isKey","type","isSymbol","test","stringToPath","toKey","baseGetTag","getRawTag","isOwn","tag","unmasked","objectToString","baseIsNative","isObject","isFunction","toSource","isMasked","baseToString","castArrayLikeObject","isArrayLikeObject","getMapData","map","data","isKeyable","getValue","hashClear","size","hashDelete","get","hashGet","hashHas","hashSet","listCacheClear","listCacheDelete","pop","listCacheGet","listCacheHas","listCacheSet","push","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","setCacheAdd","setCacheHas","setToString","count","lastCalled","string","constant","identity","stamp","remaining","arguments","apply","memoizeCapped","memoize","charCodeAt","match","number","quote","subString","intersection","baseRest","start","overRest","transform","args","otherArgs","thisArg","arrays","mapped","baseIntersection","othIndex","includes","othLength","caches","maxLength","Infinity","seen","outer","computed","resolver","TypeError","memoized","Cache","other","isArrayLike","isLength","isObjectLike","defaultValue","VERSION","define","amd","_","Record","_get_localized","ret","locales","names","i","locale","name","camelToUnderscore","toLowerCase","default_locales","prop","default_value","get_with_locales","_lookup_with_locales","substr","console","warn","country","setLocalStorage","variable","ttl_sec","expires_at","getTime","localStorage","setItem","JSON","stringify","getLocalStorage","parse","getItem","removeItem","makeRequest","url","method","request","XMLHttpRequest","Promise","resolve","reject","onreadystatechange","readyState","status","statusText","open","send","jsonDecodeIfPossible","str","makeJSONRequest","responseText","options","window","geoip_detect","ajaxurl","cookie_duration_in_days","cookie_name","ajaxPromise","get_info_raw","get_info_cached","response","storedResponse","extra","responseJSON","override","set_override","record","duration_in_days","serialize","set_override_data","remove_override","get_info","error","domReady","document","addEventListener","attachEvent","selectItemByValue","el","selectedIndex","selectItemByAttribute","attributeName","attributeValue","getAttribute","triggerNativeEvent","createEvent","event","initEvent","dispatchEvent","fireEvent","get_options","raw","action_on_elements","className","errorMessage","callback","elements","getElementsByClassName","from","forEach","get_value_from_record","property","opt","skip_cache","lang","default","do_shortcode_normal","innerText","do_shortcode_flags","get_country_iso","classList","do_shortcode_country_select","do_shortcode_text_input","do_shortcode_show_if","evaluated","geoip_detect2_shortcode_evaluate_conditions","parsed","style","display","alternativePropertyNames","isConditionMatching","op","conditions","c","subConditionMatching","raw_value","get_raw","p","geoip_detect2_shortcode_check_subcondition","v","not","expectedValues","actualValues","intersect","x","String","split","do_shortcodes","add_body_classes","css_classes","has_property","continent","province","body","getElementsByTagName","do_body_classes"],"mappings":";AAAA,SAAA,EAAA,GAaA,MAVA,mBAAA,QAAA,iBAAA,OAAA,SACA,OAAA,QAAA,EAAA,SAAA,GACA,cAAA,GAGA,OAAA,QAAA,EAAA,SAAA,GACA,OAAA,GAAA,mBAAA,QAAA,EAAA,cAAA,QAAA,IAAA,OAAA,UAAA,gBAAA,GAIA,EAAA,GAGA,OAAA,QAAA;;;AC4tBA,IAAA,EAruBA,EAAA,SAAA,GACA,aAEA,IAEA,EAFA,EAAA,OAAA,UACA,EAAA,EAAA,eAEA,EAAA,mBAAA,OAAA,OAAA,GACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,eAAA,kBACA,EAAA,EAAA,aAAA,gBAEA,SAAA,EAAA,EAAA,EAAA,GAOA,OANA,OAAA,eAAA,EAAA,EAAA,CACA,MAAA,EACA,YAAA,EACA,cAAA,EACA,UAAA,IAEA,EAAA,GAEA,IAEA,EAAA,GAAA,IACA,MAAA,GACA,EAAA,SAAA,EAAA,EAAA,GACA,OAAA,EAAA,GAAA,GAIA,SAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IAAA,EAAA,GAAA,EAAA,qBAAA,EAAA,EAAA,EACA,EAAA,OAAA,OAAA,EAAA,WACA,EAAA,IAAA,EAAA,GAAA,IAMA,OAFA,EAAA,QAsMA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAEA,OAAA,SAAA,EAAA,GACA,GAAA,IAAA,EACA,MAAA,IAAA,MAAA,gCAGA,GAAA,IAAA,EAAA,CACA,GAAA,UAAA,EACA,MAAA,EAKA,OAAA,IAMA,IAHA,EAAA,OAAA,EACA,EAAA,IAAA,IAEA,CACA,IAAA,EAAA,EAAA,SACA,GAAA,EAAA,CACA,IAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,SACA,OAAA,GAIA,GAAA,SAAA,EAAA,OAGA,EAAA,KAAA,EAAA,MAAA,EAAA,SAEA,GAAA,UAAA,EAAA,OAAA,CACA,GAAA,IAAA,EAEA,MADA,EAAA,EACA,EAAA,IAGA,EAAA,kBAAA,EAAA,SAEA,WAAA,EAAA,QACA,EAAA,OAAA,SAAA,EAAA,KAGA,EAAA,EAEA,IAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,WAAA,EAAA,KAAA,CAOA,GAJA,EAAA,EAAA,KACA,EACA,EAEA,EAAA,MAAA,EACA,SAGA,MAAA,CACA,MAAA,EAAA,IACA,KAAA,EAAA,MAGA,UAAA,EAAA,OACA,EAAA,EAGA,EAAA,OAAA,QACA,EAAA,IAAA,EAAA,OA9QA,CAAA,EAAA,EAAA,GAEA,EAcA,SAAA,EAAA,EAAA,EAAA,GACA,IACA,MAAA,CAAA,KAAA,SAAA,IAAA,EAAA,KAAA,EAAA,IACA,MAAA,GACA,MAAA,CAAA,KAAA,QAAA,IAAA,IAhBA,EAAA,KAAA,EAoBA,IAAA,EAAA,iBACA,EAAA,iBACA,EAAA,YACA,EAAA,YAIA,EAAA,GAMA,SAAA,KACA,SAAA,KACA,SAAA,KAIA,IAAA,EAAA,GACA,EAAA,GAAA,WACA,OAAA,MAGA,IAAA,EAAA,OAAA,eACA,EAAA,GAAA,EAAA,EAAA,EAAA,MACA,GACA,IAAA,GACA,EAAA,KAAA,EAAA,KAGA,EAAA,GAGA,IAAA,EAAA,EAAA,UACA,EAAA,UAAA,OAAA,OAAA,GAWA,SAAA,EAAA,GACA,CAAA,OAAA,QAAA,UAAA,QAAA,SAAA,GACA,EAAA,EAAA,EAAA,SAAA,GACA,OAAA,KAAA,QAAA,EAAA,OAkCA,SAAA,EAAA,EAAA,GAgCA,IAAA,EAgCA,KAAA,QA9BA,SAAA,EAAA,GACA,SAAA,IACA,OAAA,IAAA,EAAA,SAAA,EAAA,IAnCA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,GAAA,UAAA,EAAA,KAEA,CACA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,MACA,OAAA,GACA,iBAAA,GACA,EAAA,KAAA,EAAA,WACA,EAAA,QAAA,EAAA,SAAA,KAAA,SAAA,GACA,EAAA,OAAA,EAAA,EAAA,IACA,SAAA,GACA,EAAA,QAAA,EAAA,EAAA,KAIA,EAAA,QAAA,GAAA,KAAA,SAAA,GAIA,EAAA,MAAA,EACA,EAAA,IACA,SAAA,GAGA,OAAA,EAAA,QAAA,EAAA,EAAA,KAvBA,EAAA,EAAA,KAiCA,CAAA,EAAA,EAAA,EAAA,KAIA,OAAA,EAaA,EAAA,EAAA,KACA,EAGA,GACA,KAkHA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,EAAA,SAAA,EAAA,QACA,GAAA,IAAA,EAAA,CAKA,GAFA,EAAA,SAAA,KAEA,UAAA,EAAA,OAAA,CAEA,GAAA,EAAA,SAAA,SAGA,EAAA,OAAA,SACA,EAAA,IAAA,EACA,EAAA,EAAA,GAEA,UAAA,EAAA,QAGA,OAAA,EAIA,EAAA,OAAA,QACA,EAAA,IAAA,IAAA,UACA,kDAGA,OAAA,EAGA,IAAA,EAAA,EAAA,EAAA,EAAA,SAAA,EAAA,KAEA,GAAA,UAAA,EAAA,KAIA,OAHA,EAAA,OAAA,QACA,EAAA,IAAA,EAAA,IACA,EAAA,SAAA,KACA,EAGA,IAAA,EAAA,EAAA,IAEA,OAAA,EAOA,EAAA,MAGA,EAAA,EAAA,YAAA,EAAA,MAGA,EAAA,KAAA,EAAA,QAQA,WAAA,EAAA,SACA,EAAA,OAAA,OACA,EAAA,IAAA,GAUA,EAAA,SAAA,KACA,GANA,GA3BA,EAAA,OAAA,QACA,EAAA,IAAA,IAAA,UAAA,oCACA,EAAA,SAAA,KACA,GAoDA,SAAA,EAAA,GACA,IAAA,EAAA,CAAA,OAAA,EAAA,IAEA,KAAA,IACA,EAAA,SAAA,EAAA,IAGA,KAAA,IACA,EAAA,WAAA,EAAA,GACA,EAAA,SAAA,EAAA,IAGA,KAAA,WAAA,KAAA,GAGA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,YAAA,GACA,EAAA,KAAA,gBACA,EAAA,IACA,EAAA,WAAA,EAGA,SAAA,EAAA,GAIA,KAAA,WAAA,CAAA,CAAA,OAAA,SACA,EAAA,QAAA,EAAA,MACA,KAAA,OAAA,GA8BA,SAAA,EAAA,GACA,GAAA,EAAA,CACA,IAAA,EAAA,EAAA,GACA,GAAA,EACA,OAAA,EAAA,KAAA,GAGA,GAAA,mBAAA,EAAA,KACA,OAAA,EAGA,IAAA,MAAA,EAAA,QAAA,CACA,IAAA,GAAA,EAAA,EAAA,SAAA,IACA,OAAA,EAAA,EAAA,QACA,GAAA,EAAA,KAAA,EAAA,GAGA,OAFA,EAAA,MAAA,EAAA,GACA,EAAA,MAAA,EACA,EAOA,OAHA,EAAA,MAAA,EACA,EAAA,MAAA,EAEA,GAGA,OAAA,EAAA,KAAA,GAKA,MAAA,CAAA,KAAA,GAIA,SAAA,IACA,MAAA,CAAA,MAAA,EAAA,MAAA,GA+MA,OA5mBA,EAAA,UAAA,EAAA,YAAA,EACA,EAAA,YAAA,EACA,EAAA,YAAA,EACA,EACA,EACA,qBAaA,EAAA,oBAAA,SAAA,GACA,IAAA,EAAA,mBAAA,GAAA,EAAA,YACA,QAAA,IACA,IAAA,GAGA,uBAAA,EAAA,aAAA,EAAA,QAIA,EAAA,KAAA,SAAA,GAQA,OAPA,OAAA,eACA,OAAA,eAAA,EAAA,IAEA,EAAA,UAAA,EACA,EAAA,EAAA,EAAA,sBAEA,EAAA,UAAA,OAAA,OAAA,GACA,GAOA,EAAA,MAAA,SAAA,GACA,MAAA,CAAA,QAAA,IAsEA,EAAA,EAAA,WACA,EAAA,UAAA,GAAA,WACA,OAAA,MAEA,EAAA,cAAA,EAKA,EAAA,MAAA,SAAA,EAAA,EAAA,EAAA,EAAA,QACA,IAAA,IAAA,EAAA,SAEA,IAAA,EAAA,IAAA,EACA,EAAA,EAAA,EAAA,EAAA,GACA,GAGA,OAAA,EAAA,oBAAA,GACA,EACA,EAAA,OAAA,KAAA,SAAA,GACA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,UAuKA,EAAA,GAEA,EAAA,EAAA,EAAA,aAOA,EAAA,GAAA,WACA,OAAA,MAGA,EAAA,SAAA,WACA,MAAA,sBAkCA,EAAA,KAAA,SAAA,GACA,IAAA,EAAA,GACA,IAAA,IAAA,KAAA,EACA,EAAA,KAAA,GAMA,OAJA,EAAA,UAIA,SAAA,IACA,KAAA,EAAA,QAAA,CACA,IAAA,EAAA,EAAA,MACA,GAAA,KAAA,EAGA,OAFA,EAAA,MAAA,EACA,EAAA,MAAA,EACA,EAQA,OADA,EAAA,MAAA,EACA,IAsCA,EAAA,OAAA,EAMA,EAAA,UAAA,CACA,YAAA,EAEA,MAAA,SAAA,GAcA,GAbA,KAAA,KAAA,EACA,KAAA,KAAA,EAGA,KAAA,KAAA,KAAA,MAAA,EACA,KAAA,MAAA,EACA,KAAA,SAAA,KAEA,KAAA,OAAA,OACA,KAAA,IAAA,EAEA,KAAA,WAAA,QAAA,IAEA,EACA,IAAA,IAAA,KAAA,KAEA,MAAA,EAAA,OAAA,IACA,EAAA,KAAA,KAAA,KACA,OAAA,EAAA,MAAA,MACA,KAAA,GAAA,IAMA,KAAA,WACA,KAAA,MAAA,EAEA,IACA,EADA,KAAA,WAAA,GACA,WACA,GAAA,UAAA,EAAA,KACA,MAAA,EAAA,IAGA,OAAA,KAAA,MAGA,kBAAA,SAAA,GACA,GAAA,KAAA,KACA,MAAA,EAGA,IAAA,EAAA,KACA,SAAA,EAAA,EAAA,GAYA,OAXA,EAAA,KAAA,QACA,EAAA,IAAA,EACA,EAAA,KAAA,EAEA,IAGA,EAAA,OAAA,OACA,EAAA,IAAA,KAGA,EAGA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CACA,IAAA,EAAA,KAAA,WAAA,GACA,EAAA,EAAA,WAEA,GAAA,SAAA,EAAA,OAIA,OAAA,EAAA,OAGA,GAAA,EAAA,QAAA,KAAA,KAAA,CACA,IAAA,EAAA,EAAA,KAAA,EAAA,YACA,EAAA,EAAA,KAAA,EAAA,cAEA,GAAA,GAAA,EAAA,CACA,GAAA,KAAA,KAAA,EAAA,SACA,OAAA,EAAA,EAAA,UAAA,GACA,GAAA,KAAA,KAAA,EAAA,WACA,OAAA,EAAA,EAAA,iBAGA,GAAA,GACA,GAAA,KAAA,KAAA,EAAA,SACA,OAAA,EAAA,EAAA,UAAA,OAGA,CAAA,IAAA,EAMA,MAAA,IAAA,MAAA,0CALA,GAAA,KAAA,KAAA,EAAA,WACA,OAAA,EAAA,EAAA,gBAUA,OAAA,SAAA,EAAA,GACA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CACA,IAAA,EAAA,KAAA,WAAA,GACA,GAAA,EAAA,QAAA,KAAA,MACA,EAAA,KAAA,EAAA,eACA,KAAA,KAAA,EAAA,WAAA,CACA,IAAA,EAAA,EACA,OAIA,IACA,UAAA,GACA,aAAA,IACA,EAAA,QAAA,GACA,GAAA,EAAA,aAGA,EAAA,MAGA,IAAA,EAAA,EAAA,EAAA,WAAA,GAIA,OAHA,EAAA,KAAA,EACA,EAAA,IAAA,EAEA,GACA,KAAA,OAAA,OACA,KAAA,KAAA,EAAA,WACA,GAGA,KAAA,SAAA,IAGA,SAAA,SAAA,EAAA,GACA,GAAA,UAAA,EAAA,KACA,MAAA,EAAA,IAcA,MAXA,UAAA,EAAA,MACA,aAAA,EAAA,KACA,KAAA,KAAA,EAAA,IACA,WAAA,EAAA,MACA,KAAA,KAAA,KAAA,IAAA,EAAA,IACA,KAAA,OAAA,SACA,KAAA,KAAA,OACA,WAAA,EAAA,MAAA,IACA,KAAA,KAAA,GAGA,GAGA,OAAA,SAAA,GACA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CACA,IAAA,EAAA,KAAA,WAAA,GACA,GAAA,EAAA,aAAA,EAGA,OAFA,KAAA,SAAA,EAAA,WAAA,EAAA,UACA,EAAA,GACA,IAKA,MAAA,SAAA,GACA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CACA,IAAA,EAAA,KAAA,WAAA,GACA,GAAA,EAAA,SAAA,EAAA,CACA,IAAA,EAAA,EAAA,WACA,GAAA,UAAA,EAAA,KAAA,CACA,IAAA,EAAA,EAAA,IACA,EAAA,GAEA,OAAA,GAMA,MAAA,IAAA,MAAA,0BAGA,cAAA,SAAA,EAAA,EAAA,GAaA,OAZA,KAAA,SAAA,CACA,SAAA,EAAA,GACA,WAAA,EACA,QAAA,GAGA,SAAA,KAAA,SAGA,KAAA,IAAA,GAGA,IAQA,EA7sBA,CAotBA,iBAAA,OAAA,OAAA,QAAA,IAGA,IACA,mBAAA,EACA,MAAA,GAUA,SAAA,IAAA,yBAAA,CAAA;;AC1uBA,OAAA,QAAA,QAAA;;ACAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,IACA,IAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,MACA,MAAA,GAEA,YADA,EAAA,GAIA,EAAA,KACA,EAAA,GAEA,QAAA,QAAA,GAAA,KAAA,EAAA,GAIA,SAAA,EAAA,GACA,OAAA,WACA,IAAA,EAAA,KACA,EAAA,UACA,OAAA,IAAA,QAAA,SAAA,EAAA,GACA,IAAA,EAAA,EAAA,MAAA,EAAA,GAEA,SAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAGA,SAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,GAGA,OAAA,MAKA,OAAA,QAAA;;ACpCA,SAAA,EAAA,EAAA,GACA,KAAA,aAAA,GACA,MAAA,IAAA,UAAA,qCAIA,OAAA,QAAA;;ACNA,SAAA,EAAA,EAAA,GACA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,IAAA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,aAAA,EACA,EAAA,cAAA,EACA,UAAA,IAAA,EAAA,UAAA,GACA,OAAA,eAAA,EAAA,EAAA,IAAA,IAIA,SAAA,EAAA,EAAA,EAAA,GAGA,OAFA,GAAA,EAAA,EAAA,UAAA,GACA,GAAA,EAAA,EAAA,GACA,EAGA,OAAA,QAAA;;;;ACPC,IAAA,EAAA,EAAA,UAAA,GAAA,EAAA,EAAA,QAAA,kCAAA,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,IAAC,WAGIA,IAAAA,EAMAC,EAAkB,sBAGlBC,EAAiB,4BAGjBC,EAAmB,IAGnBC,EAAY,IACZC,EAAW,GAGXC,EAAW,EAAA,EACXC,EAAmB,iBAGnBC,EAAW,yBACXC,EAAU,oBACVC,EAAS,6BACTC,EAAU,gBACVC,EAAW,iBACXC,EAAY,kBACZC,EAAe,qBAGfC,EAAe,mDACfC,EAAgB,QAChBC,EAAa,mGASbC,EAAe,WAGfC,EAAe,8BAGfC,EAA8B,gBAAVC,IAAAA,EAAAA,aAAAA,EAAAA,EAAAA,SAAAA,KAAsBA,GAAUA,EAAOC,SAAWA,QAAUD,EAGhFE,EAA0B,WAARC,oBAAAA,KAAAA,aAAAA,EAAAA,EAAAA,SAAAA,QAAoBA,MAAQA,KAAKF,SAAWA,QAAUE,KAGxEC,EAAOL,GAAcG,GAAYG,SAAS,cAATA,GAGjCC,EAAgC,WAAXC,oBAAAA,QAAAA,aAAAA,EAAAA,EAAAA,SAAAA,WAAuBA,UAAYA,QAAQC,UAAYD,QAG5EE,EAAaH,GAAgC,WAAVI,oBAAAA,OAAAA,aAAAA,EAAAA,EAAAA,SAAAA,UAAsBA,SAAWA,OAAOF,UAAYE,OAiClFC,SAAAA,EAAcC,EAAOC,GAErB,SADe,MAATD,EAAgB,EAAIA,EAAME,SA6EhCC,SAAYH,EAAOC,EAAOG,GAC1BH,OAAAA,GAAUA,EA+DVI,SAAcL,EAAOC,EAAOG,GAC/BE,IAAAA,EAAQF,EAAY,EACpBF,EAASF,EAAME,OAEZ,OAAEI,EAAQJ,GACXF,GAAAA,EAAMM,KAAWL,EACZK,OAAAA,EAGJ,OAAC,EAvEJD,CAAcL,EAAOC,EAAOG,GAvBzBG,SAAcP,EAAOQ,EAAWJ,EAAWK,GAC9CP,IAAAA,EAASF,EAAME,OACfI,EAAQF,GAAaK,EAAY,GAAK,GAElCA,KAAAA,EAAYH,MAAYA,EAAQJ,GAClCM,GAAAA,EAAUR,EAAMM,GAAQA,EAAON,GAC1BM,OAAAA,EAGJ,OAAC,EAeJC,CAAcP,EAAOU,EAAWN,GA/EjBD,CAAYH,EAAOC,EAAO,IAAM,EAY5CU,SAAAA,EAAkBX,EAAOC,EAAOW,GAIhC,IAHHN,IAAAA,GAAS,EACTJ,EAAkB,MAATF,EAAgB,EAAIA,EAAME,SAE9BI,EAAQJ,GACXU,GAAAA,EAAWX,EAAOD,EAAMM,IACnB,OAAA,EAGJ,OAAA,EAYAO,SAAAA,EAASb,EAAOc,GAKhB,IAJHR,IAAAA,GAAS,EACTJ,EAAkB,MAATF,EAAgB,EAAIA,EAAME,OACnCa,EAASC,MAAMd,KAEVI,EAAQJ,GACfa,EAAOT,GAASQ,EAASd,EAAMM,GAAQA,EAAON,GAEzCe,OAAAA,EAgDAL,SAAAA,EAAUT,GACVA,OAAAA,GAAUA,EAUVgB,SAAAA,EAAUC,GACV,OAAA,SAASjB,GACPiB,OAAAA,EAAKjB,IAYPkB,SAAAA,EAASC,EAAOC,GAChBD,OAAAA,EAAME,IAAID,GAwCfE,IAeEC,EAfFD,EAAaP,MAAMS,UACnBC,EAAYjC,SAASgC,UACrBE,EAActC,OAAOoC,UAGrBG,EAAapC,EAAK,sBAGlBqC,EAAeH,EAAUI,SAGzBC,EAAiBJ,EAAYI,eAG7BC,GACER,EAAM,SAASS,KAAKL,GAAcA,EAAWM,MAAQN,EAAWM,KAAKC,UAAY,KACvE,iBAAmBX,EAAO,GAQtCY,EAAuBT,EAAYG,SAGnCO,EAAaC,OAAO,IACtBT,EAAaU,KAAKR,GAAgBS,QA/OjB,sBA+OuC,QACvDA,QAAQ,yDAA0D,SAAW,KAI5EC,EAASjD,EAAKiD,OACdC,EAASnB,EAAWmB,OACpBC,EAAiBF,EAASA,EAAOG,YAAc7E,EAE/C8E,EAAkB,WAChB,IACE3B,IAAAA,EAAO4B,GAAUzD,OAAQ,kBAEtB6B,OADPA,EAAK,GAAI,GAAI,IACNA,EACP,MAAO6B,KALW,GASlBC,EAAYC,KAAKC,IACjBC,EAAYF,KAAKG,IACjBC,EAAYC,KAAKC,IAGjBC,EAAMV,GAAUtD,EAAM,OACtBiE,EAAeX,GAAUzD,OAAQ,UAMjCqE,EAAcjB,EAASA,EAAOhB,UAAY1D,EAC1C4F,GAAiBD,EAAcA,EAAY5B,SAAW/D,EAyHjD6F,SAAAA,MAaAC,SAAAA,GAAKC,GACRxD,IAAAA,GAAS,EACTJ,EAAoB,MAAX4D,EAAkB,EAAIA,EAAQ5D,OAGpC,IADF6D,KAAAA,UACIzD,EAAQJ,GAAQ,CACnB8D,IAAAA,EAAQF,EAAQxD,GACf2D,KAAAA,IAAID,EAAM,GAAIA,EAAM,KAiGpBE,SAAAA,GAAUJ,GACbxD,IAAAA,GAAS,EACTJ,EAAoB,MAAX4D,EAAkB,EAAIA,EAAQ5D,OAGpC,IADF6D,KAAAA,UACIzD,EAAQJ,GAAQ,CACnB8D,IAAAA,EAAQF,EAAQxD,GACf2D,KAAAA,IAAID,EAAM,GAAIA,EAAM,KA8GpBG,SAAAA,GAASL,GACZxD,IAAAA,GAAS,EACTJ,EAAoB,MAAX4D,EAAkB,EAAIA,EAAQ5D,OAGpC,IADF6D,KAAAA,UACIzD,EAAQJ,GAAQ,CACnB8D,IAAAA,EAAQF,EAAQxD,GACf2D,KAAAA,IAAID,EAAM,GAAIA,EAAM,KAiGpBI,SAAAA,GAASC,GACZ/D,IAAAA,GAAS,EACTJ,EAAmB,MAAVmE,EAAiB,EAAIA,EAAOnE,OAGlC,IADFoE,KAAAA,SAAW,IAAIH,KACX7D,EAAQJ,GACVqE,KAAAA,IAAIF,EAAO/D,IA8CXkE,SAAAA,GAAaxE,EAAOqB,GAEpBnB,IADHA,IAAAA,EAASF,EAAME,OACZA,KACDuE,GAAAA,GAAGzE,EAAME,GAAQ,GAAImB,GAChBnB,OAAAA,EAGJ,OAAC,EAWDwE,SAAAA,GAAQC,EAAQC,GAMhBD,IAHHrE,IAAAA,EAAQ,EACRJ,GAHJ0E,EAkLOC,SAAS5E,EAAO0E,GACnBG,GAAAA,GAAQ7E,GACHA,OAAAA,EAEF8E,OAkEAA,SAAM9E,EAAO0E,GAChBG,GAAAA,GAAQ7E,GACH,OAAA,EAEL+E,IAAAA,GAAc/E,EAAAA,EAAAA,SAAAA,GACd+E,GAAQ,UAARA,GAA4B,UAARA,GAA4B,WAARA,GAC/B,MAAT/E,GAAiBgF,GAAShF,GACrB,OAAA,EAEFlB,OAAAA,EAAcmG,KAAKjF,KAAWnB,EAAaoG,KAAKjF,IAC1C,MAAV0E,GAAkB1E,KAASZ,OAAOsF,GA5E9BI,CAAM9E,EAAO0E,GAAU,CAAC1E,GAASkF,GAAarD,GAAS7B,IAtLvD4E,CAASD,EAAMD,IAGJzE,OAED,MAAVyE,GAAkBrE,EAAQJ,GAC/ByE,EAASA,EAAOS,GAAMR,EAAKtE,OAErBA,OAAAA,GAASA,GAASJ,EAAUyE,EAAS5G,EAUtCsH,SAAAA,GAAWpF,GACdA,OAAS,MAATA,EACKA,IAAUlC,EAAYc,EAAeH,EAEtCiE,GAAkBA,KAAkBtD,OAAOY,GAsM5CqF,SAAUrF,GACbsF,IAAAA,EAAQxD,EAAeQ,KAAKtC,EAAO0C,GACnC6C,EAAMvF,EAAM0C,GAEZ,IACF1C,EAAM0C,GAAkB5E,EACpB0H,IAAAA,GAAW,EACf,MAAO1C,IAELhC,IAAAA,EAASqB,EAAqBG,KAAKtC,GACnCwF,IACEF,EACFtF,EAAM0C,GAAkB6C,SAEjBvF,EAAM0C,IAGV5B,OAAAA,EAtNHuE,CAAUrF,GAkSPyF,SAAezF,GACfmC,OAAAA,EAAqBG,KAAKtC,GAlS7ByF,CAAezF,GA0EZ0F,SAAAA,GAAa1F,GAChB,SAAC2F,GAAS3F,KAuLEiB,EAvLiBjB,EAwLxB+B,GAAeA,KAAcd,MArLxB2E,GAAW5F,GAASoC,EAAanD,GAChCgG,KAmURY,SAAS5E,GACZA,GAAQ,MAARA,EAAc,CACZ,IACKW,OAAAA,EAAaU,KAAKrB,GACzB,MAAO6B,IACL,IACM7B,OAAAA,EAAO,GACf,MAAO6B,KAEJ,MAAA,GA5Ua+C,CAAS7F,IAmLtB8F,IAAS7E,EA3IT8E,SAAAA,GAAa/F,GAEhB,GAAgB,iBAATA,EACFA,OAAAA,EAEL6E,GAAAA,GAAQ7E,GAEHY,OAAAA,EAASZ,EAAO+F,IAAgB,GAErCf,GAAAA,GAAShF,GACJ0D,OAAAA,GAAiBA,GAAepB,KAAKtC,GAAS,GAEnDc,IAAAA,EAAUd,EAAQ,GACdc,MAAU,KAAVA,GAAkB,EAAId,IAAW5B,EAAY,KAAO0C,EAUrDkF,SAAAA,GAAoBhG,GACpBiG,OAAAA,GAAkBjG,GAASA,EAAQ,GA0BnCkG,SAAAA,GAAWC,EAAK/E,GACnBgF,IA0EapG,EACb+E,EA3EAqB,EAAOD,EAAI9B,SACRgC,OAyEUrG,EAzEAoB,GA2ED,WADZ2D,GAAc/E,EAAAA,EAAAA,SAAAA,KACkB,UAAR+E,GAA4B,UAARA,GAA4B,WAARA,EACrD,cAAV/E,EACU,OAAVA,GA5EDoG,EAAmB,iBAAPhF,EAAkB,SAAW,QACzCgF,EAAKD,IAWFtD,SAAAA,GAAU6B,EAAQtD,GACrBpB,IAAAA,EA3zBGsG,SAAS5B,EAAQtD,GACjBsD,OAAU,MAAVA,EAAiB5G,EAAY4G,EAAOtD,GA0zB/BkF,CAAS5B,EAAQtD,GACtBsE,OAAAA,GAAa1F,GAASA,EAAQlC,EArgBvC8F,GAAKpC,UAAUsC,MAvENyC,WACFlC,KAAAA,SAAWb,EAAeA,EAAa,MAAQ,GAC/CgD,KAAAA,KAAO,GAsEd5C,GAAKpC,UAAL,OAzDSiF,SAAWrF,GACdN,IAAAA,EAAS,KAAKO,IAAID,WAAe,KAAKiD,SAASjD,GAE5CN,OADF0F,KAAAA,MAAQ1F,EAAS,EAAI,EACnBA,GAuDT8C,GAAKpC,UAAUkF,IA3CNC,SAAQvF,GACXgF,IAAAA,EAAO,KAAK/B,SACZb,GAAAA,EAAc,CACZ1C,IAAAA,EAASsF,EAAKhF,GACXN,OAAAA,IAAW9C,EAAiBF,EAAYgD,EAE1CgB,OAAAA,EAAeQ,KAAK8D,EAAMhF,GAAOgF,EAAKhF,GAAOtD,GAsCtD8F,GAAKpC,UAAUH,IA1BNuF,SAAQxF,GACXgF,IAAAA,EAAO,KAAK/B,SACTb,OAAAA,EAAgB4C,EAAKhF,KAAStD,EAAagE,EAAeQ,KAAK8D,EAAMhF,IAyB9EwC,GAAKpC,UAAUwC,IAZN6C,SAAQzF,EAAKpB,GAChBoG,IAAAA,EAAO,KAAK/B,SAGT,OAFFmC,KAAAA,MAAQ,KAAKnF,IAAID,GAAO,EAAI,EACjCgF,EAAKhF,GAAQoC,GAAgBxD,IAAUlC,EAAaE,EAAiBgC,EAC9D,MAyHTiE,GAAUzC,UAAUsC,MApFXgD,WACFzC,KAAAA,SAAW,GACXmC,KAAAA,KAAO,GAmFdvC,GAAUzC,UAAV,OAvESuF,SAAgB3F,GACnBgF,IAAAA,EAAO,KAAK/B,SACZhE,EAAQkE,GAAa6B,EAAMhF,GAE3Bf,QAAAA,EAAQ,IAIRA,GADY+F,EAAKnG,OAAS,EAE5BmG,EAAKY,MAELvE,EAAOH,KAAK8D,EAAM/F,EAAO,KAEzB,KAAKmG,KACA,KA0DTvC,GAAUzC,UAAUkF,IA9CXO,SAAa7F,GAChBgF,IAAAA,EAAO,KAAK/B,SACZhE,EAAQkE,GAAa6B,EAAMhF,GAExBf,OAAAA,EAAQ,EAAIvC,EAAYsI,EAAK/F,GAAO,IA2C7C4D,GAAUzC,UAAUH,IA/BX6F,SAAa9F,GACbmD,OAAAA,GAAa,KAAKF,SAAUjD,IAAQ,GA+B7C6C,GAAUzC,UAAUwC,IAlBXmD,SAAa/F,EAAKpB,GACrBoG,IAAAA,EAAO,KAAK/B,SACZhE,EAAQkE,GAAa6B,EAAMhF,GAQxB,OANHf,EAAQ,KACR,KAAKmG,KACPJ,EAAKgB,KAAK,CAAChG,EAAKpB,KAEhBoG,EAAK/F,GAAO,GAAKL,EAEZ,MA2GTkE,GAAS1C,UAAUsC,MAtEVuD,WACFb,KAAAA,KAAO,EACPnC,KAAAA,SAAW,CACN,KAAA,IAAIT,GACL,IAAA,IAAKL,GAAOU,IACT,OAAA,IAAIL,KAkElBM,GAAS1C,UAAT,OArDS8F,SAAelG,GAClBN,IAAAA,EAASoF,GAAW,KAAM9E,GAAjB,OAAgCA,GAEtCN,OADF0F,KAAAA,MAAQ1F,EAAS,EAAI,EACnBA,GAmDToD,GAAS1C,UAAUkF,IAvCVa,SAAYnG,GACZ8E,OAAAA,GAAW,KAAM9E,GAAKsF,IAAItF,IAuCnC8C,GAAS1C,UAAUH,IA3BVmG,SAAYpG,GACZ8E,OAAAA,GAAW,KAAM9E,GAAKC,IAAID,IA2BnC8C,GAAS1C,UAAUwC,IAdVyD,SAAYrG,EAAKpB,GACpBoG,IAAAA,EAAOF,GAAW,KAAM9E,GACxBoF,EAAOJ,EAAKI,KAIT,OAFPJ,EAAKpC,IAAI5C,EAAKpB,GACTwG,KAAAA,MAAQJ,EAAKI,MAAQA,EAAO,EAAI,EAC9B,MA2DTrC,GAAS3C,UAAU8C,IAAMH,GAAS3C,UAAU4F,KAnBnCM,SAAY1H,GAEZ,OADFqE,KAAAA,SAASL,IAAIhE,EAAOhC,GAClB,MAkBTmG,GAAS3C,UAAUH,IANVsG,SAAY3H,GACZ,OAAA,KAAKqE,SAAShD,IAAIrB,IAuYvB4H,IAWc3G,GACZ4G,GACAC,GAbFF,IAWc3G,GAhPK2B,EAA4B,SAAS3B,EAAM8G,GACzDnF,OAAAA,EAAe3B,EAAM,WAAY,CACtB,cAAA,EACF,YAAA,EACL+G,MAAAA,GAASD,GACN,UAAA,KALwBE,GAiPlCJ,GAAQ,EACRC,GAAa,EAEV,WACDI,IAAAA,EAAQ9E,IACR+E,EAAYhK,GAAY+J,EAAQJ,IAGhCK,GADJL,GAAaI,EACTC,EAAY,GACV,KAAEN,IAAS3J,EACNkK,OAAAA,UAAU,QAGnBP,GAAQ,EAEH5G,OAAAA,GAAKoH,MAAMvK,EAAWsK,aAW7BlD,IAAAA,GAnGKoD,SAAcrH,GACjBH,IAAAA,EAASyH,GAAQtH,EAAM,SAASG,GAI3BA,OAHHD,EAAMqF,OAASvI,GACjBkD,EAAM2C,QAED1C,IAGLD,EAAQL,EAAOK,MACZL,OAAAA,EA0FUwH,CAAc,SAASP,GACpCjH,IAAAA,EAAS,GAONA,OANsB,KAAzBiH,EAAOS,WAAW,IACpB1H,EAAOsG,KAAK,IAEdW,EAAOxF,QAAQxD,EAAY,SAAS0J,EAAOC,EAAQC,EAAOC,GACxD9H,EAAOsG,KAAKuB,EAAQC,EAAUrG,QAAQvD,EAAc,MAAS0J,GAAUD,KAElE3H,IAUAqE,SAAAA,GAAMnF,GACT,GAAgB,iBAATA,GAAqBgF,GAAShF,GAChCA,OAAAA,EAELc,IAAAA,EAAUd,EAAQ,GACdc,MAAU,KAAVA,GAAkB,EAAId,IAAW5B,EAAY,KAAO0C,EAyC1D+H,IAAAA,GAvVKC,SAAS7H,EAAM8H,GACfnB,OAAAA,GAmNAoB,SAAS/H,EAAM8H,EAAOE,GAEtB,OADPF,EAAQhG,EAAUgG,IAAUjL,EAAamD,EAAKhB,OAAS,EAAK8I,EAAO,GAC5D,WAME,IALHG,IAAAA,EAAOd,UACP/H,GAAS,EACTJ,EAAS8C,EAAUmG,EAAKjJ,OAAS8I,EAAO,GACxChJ,EAAQgB,MAAMd,KAETI,EAAQJ,GACfF,EAAMM,GAAS6I,EAAKH,EAAQ1I,GAE9BA,GAAS,EAEF,IADH8I,IAAAA,EAAYpI,MAAMgI,EAAQ,KACrB1I,EAAQ0I,GACfI,EAAU9I,GAAS6I,EAAK7I,GAGnBgI,OADPc,EAAUJ,GAASE,EAAUlJ,GAnlCxBsI,SAAMpH,EAAMmI,EAASF,GACpBA,OAAAA,EAAKjJ,QACN,KAAA,EAAUgB,OAAAA,EAAKqB,KAAK8G,GACpB,KAAA,EAAUnI,OAAAA,EAAKqB,KAAK8G,EAASF,EAAK,IAClC,KAAA,EAAUjI,OAAAA,EAAKqB,KAAK8G,EAASF,EAAK,GAAIA,EAAK,IAC3C,KAAA,EAAUjI,OAAAA,EAAKqB,KAAK8G,EAASF,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAEpDjI,OAAAA,EAAKoH,MAAMe,EAASF,GA6kClBb,CAAMpH,EAAM,KAAMkI,IApORH,CAAS/H,EAAM8H,EAAOd,IAAWhH,EAAO,IAsV1C6H,CAAS,SAASO,GAC/BC,IAAAA,EAAS1I,EAASyI,EAAQrD,IACtBsD,OAAAA,EAAOrJ,QAAUqJ,EAAO,KAAOD,EAAO,GAtavCE,SAAiBF,EAAQxI,EAAUF,GASnC6I,IARHC,IAAAA,EAAW9I,EAAaD,EAAoBZ,EAC5CG,EAASoJ,EAAO,GAAGpJ,OACnByJ,EAAYL,EAAOpJ,OACnBuJ,EAAWE,EACXC,EAAS5I,MAAM2I,GACfE,EAAYC,EAAAA,EACZ/I,EAAS,GAEN0I,KAAY,CACbzJ,IAAAA,EAAQsJ,EAAOG,GACfA,GAAY3I,IACdd,EAAQa,EAASb,EAAOiB,EAAUH,KAEpC+I,EAAY1G,EAAUnD,EAAME,OAAQ2J,GACpCD,EAAOH,IAAa7I,IAAeE,GAAaZ,GAAU,KAAOF,EAAME,QAAU,KAC7E,IAAIkE,GAASqF,GAAYzJ,GACzBjC,EAENiC,EAAQsJ,EAAO,GAEXhJ,IAAAA,GAAS,EACTyJ,EAAOH,EAAO,GAElBI,EACA,OAAS1J,EAAQJ,GAAUa,EAAOb,OAAS2J,GAAW,CAChD5J,IAAAA,EAAQD,EAAMM,GACd2J,EAAWnJ,EAAWA,EAASb,GAASA,EAGxC,GADJA,EAASW,GAAwB,IAAVX,EAAeA,EAAQ,IACxC8J,EACE5I,EAAS4I,EAAME,GACfP,EAAS3I,EAAQkJ,EAAUrJ,IAC5B,CAEE,IADP6I,EAAWE,IACFF,GAAU,CACbrI,IAAAA,EAAQwI,EAAOH,GACf,KAAErI,EACED,EAASC,EAAO6I,GAChBP,EAASJ,EAAOG,GAAWQ,EAAUrJ,IAElCoJ,SAAAA,EAGTD,GACFA,EAAK1C,KAAK4C,GAEZlJ,EAAOsG,KAAKpH,IAGTc,OAAAA,EAqXHyI,CAAiBD,GACjB,KAiDGf,SAAAA,GAAQtH,EAAMgJ,GACjB,GAAe,mBAARhJ,GAAmC,MAAZgJ,GAAuC,mBAAZA,EACrD,MAAA,IAAIC,UAAUnM,GAElBoM,IAAAA,EAAW,SAAXA,IACEjB,IAAAA,EAAOd,UACPhH,EAAM6I,EAAWA,EAAS5B,MAAM,KAAMa,GAAQA,EAAK,GACnD/H,EAAQgJ,EAAShJ,MAEjBA,GAAAA,EAAME,IAAID,GACLD,OAAAA,EAAMuF,IAAItF,GAEfN,IAAAA,EAASG,EAAKoH,MAAM,KAAMa,GAEvBpI,OADPqJ,EAAShJ,MAAQA,EAAM6C,IAAI5C,EAAKN,IAAWK,EACpCL,GAGFqJ,OADPA,EAAShJ,MAAQ,IAAKoH,GAAQ6B,OAASlG,IAChCiG,EAwCA3F,SAAAA,GAAGxE,EAAOqK,GACVrK,OAAAA,IAAUqK,GAAUrK,GAAUA,GAASqK,GAAUA,EArC1D9B,GAAQ6B,MAAQlG,GA+DZW,IAAAA,GAAU9D,MAAM8D,QA2BXyF,SAAAA,GAAYtK,GACZA,OAAS,MAATA,GAAiBuK,GAASvK,EAAMC,UAAY2F,GAAW5F,GA4BvDiG,SAAAA,GAAkBjG,GAClBwK,OAAAA,GAAaxK,IAAUsK,GAAYtK,GAoBnC4F,SAAAA,GAAW5F,GACd,IAAC2F,GAAS3F,GACL,OAAA,EAILuF,IAAAA,EAAMH,GAAWpF,GACduF,OAAAA,GAAOhH,GAAWgH,GAAO/G,GAAU+G,GAAOjH,GAAYiH,GAAO7G,EA6B7D6L,SAAAA,GAASvK,GACT,MAAgB,iBAATA,GACZA,GAAS,GAAKA,EAAQ,GAAK,GAAKA,GAAS3B,EA4BpCsH,SAAAA,GAAS3F,GACZ+E,IAAAA,GAAc/E,EAAAA,EAAAA,SAAAA,GACXA,OAAS,MAATA,IAA0B,UAAR+E,GAA4B,YAARA,GA2BtCyF,SAAAA,GAAaxK,GACbA,OAAS,MAATA,GAAiC,WAAhB,EAAOA,EAAAA,SAAAA,GAoBxBgF,SAAAA,GAAShF,GACT,MAAgB,WAAhB,EAAOA,EAAAA,SAAAA,IACXwK,GAAaxK,IAAUoF,GAAWpF,IAAUrB,EAwBxCkD,SAAAA,GAAS7B,GACTA,OAAS,MAATA,EAAgB,GAAK+F,GAAa/F,GAwDlCgI,SAAAA,GAAShI,GACT,OAAA,WACEA,OAAAA,GAoBFiI,SAAAA,GAASjI,GACTA,OAAAA,EAMT2D,GAAOqE,SAAWA,GAClBrE,GAAOkF,aAAeA,GACtBlF,GAAO4E,QAAUA,GAKjB5E,GAAOa,GAAKA,GACZb,GAAO+C,IA/DEA,SAAIhC,EAAQC,EAAM8F,GACrB3J,IAAAA,EAAmB,MAAV4D,EAAiB5G,EAAY2G,GAAQC,EAAQC,GACnD7D,OAAAA,IAAWhD,EAAY2M,EAAe3J,GA8D/C6C,GAAOsE,SAAWA,GAClBtE,GAAOkB,QAAUA,GACjBlB,GAAO2G,YAAcA,GACrB3G,GAAOsC,kBAAoBA,GAC3BtC,GAAOiC,WAAaA,GACpBjC,GAAO4G,SAAWA,GAClB5G,GAAOgC,SAAWA,GAClBhC,GAAO6G,aAAeA,GACtB7G,GAAOqB,SAAWA,GAClBrB,GAAO9B,SAAWA,GAWlB8B,GAAO+G,QAruDO,SA0uDO,mBAAVC,GAA6C,WAArB,EAAOA,EAAAA,SAAAA,EAAOC,MAAmBD,EAAOC,KAKzErL,EAAKsL,EAAIlH,GAITgH,EAAO,WACEhH,OAAAA,MAIF/D,IAENA,EAAWF,QAAUiE,IAAQkH,EAAIlH,GAElClE,EAAYoL,EAAIlH,IAIhBpE,EAAKsL,EAAIlH,KAEXrB,UAxwDD;;ACyGcwI,aAAAA,OAAAA,eAAAA,QAAAA,aAAAA,CAAAA,OAAAA,IAAAA,QAAAA,QAAAA,QAAAA,uBAAAA,EAAAA,IAAAA,EAAAA,EAAAA,QAAAA,0CAAAA,EAAAA,EAAAA,QAAAA,uCAAAA,EAAAA,EAAAA,QAAAA,kCAjHf,EAAA,EAAA,QAAA,qBAiHeA,SAAAA,EAAAA,GAAAA,OAAAA,GAAAA,EAAAA,WAAAA,EAAAA,CAAAA,QAAAA,GA9Gf,IAAMC,EAAiB,SAASC,EAAKC,GAC7B,GAAgB,YAAhB,EAAOD,EAAAA,SAAAA,GAAmB,CAStB,GAPoB,iBAAbC,IACPA,EAAU,CAAEA,IAEQ,YAApB,EAAOA,EAAAA,SAAAA,KACPA,EAAU,IAGY,YAAtB,EAAOD,EAAAA,SAAAA,EAAIE,OACN,IAAA,IAAIC,EAAI,EAAIA,EAAIF,EAAQhL,OAASkL,IAAK,CACnCC,IAAAA,EAASH,EAAQE,GAEjBH,GAAAA,EAAIE,MAAME,GACHJ,OAAAA,EAAIE,MAAME,GAKzBJ,GAAAA,EAAIK,KACGL,OAAAA,EAAIK,KAGZL,OAAAA,GAGEM,EAAoB,SAASlK,GAE/BA,OAAAA,EAAImB,QAAQ,wBAAyB,OAAOgJ,eAiFxCT,QAAAA,kBAAAA,EA9ETA,IAAAA,EAAAA,WAIU1E,SAAAA,EAAAA,EAAMoF,IAAiB,EAAA,EAAA,SAAA,KAAA,GAHnCpF,KAAAA,KAAO,GACPoF,KAAAA,gBAAkB,GAGTpF,KAAAA,KAAOA,GAAQ,GACfoF,KAAAA,gBAAkBA,GAAmB,CAAC,MAwEpCV,OAAAA,EAAAA,EAAAA,SAAAA,EAAAA,CAAAA,CAAAA,IAAAA,MArEX,MAAA,SAAIW,EAAMC,GACC,OAAA,KAAKC,iBAAiBF,EAAM,KAAMC,KAoElCZ,CAAAA,IAAAA,UAjEX,MAAA,SAAQW,GAEGZ,OADPY,EAAOH,EAAkBG,GAClBZ,EAAEnE,QAAAA,IAAI,KAAKN,KAAMqF,EAAM,QA+DvBX,CAAAA,IAAAA,eA5DX,MAAA,SAAaW,GAEF,YAAgB,IADX,KAAKG,qBAAqBH,EAAM,KAAKD,mBA2D1CV,CAAAA,IAAAA,uBAvDX,MAAA,SAAqBW,EAAMR,GAASS,IAAAA,EAAgB,UAAA,OAAA,QAAA,IAAA,UAAA,GAAA,UAAA,GAAA,GAIxB,WAHxBD,EAAOH,EAAkBG,IAGhBI,QAAQ,KACbJ,EAAOA,EAAKI,OAAO,EAAGJ,EAAKxL,OAAS,IAGpC+K,IAAAA,EAAMH,EAAEnE,QAAAA,IAAI,KAAKN,KAAMqF,EAAMC,GAK1BV,OAFPA,EAAMD,EAAeC,EAAKC,KA4CnBH,CAAAA,IAAAA,mBAvCX,MAAA,SAAiBW,EAAMR,EAASS,GACvB3K,MAAM8D,QAAQoG,IAA+B,IAAnBA,EAAQhL,SACnCgL,EAAU,KAAKO,iBAGbR,IAAAA,EAAM,KAAKY,qBAAqBH,EAAMR,EAASS,GAKjD,MAHgB,YAAhB,EAAOV,EAAAA,SAAAA,IACPc,QAAQC,KAAK,2CAA6CN,EAAO,kBAA2BT,EAAAA,EAAAA,SAAAA,GAAO,iCAAkCA,QAErH,IAATA,GACPc,QAAQC,KAAK,2CAA6CN,EAAO,oFAAqF,CAAErF,KAAM,KAAKA,OAC5J,IAGJ4E,IAwBAF,CAAAA,IAAAA,kBArBX,MAAA,WACQkB,IAAAA,EAAU,KAAKtF,IAAI,oBAIhBsF,OAHJA,IACCA,EAAUA,EAAQH,OAAO,EAAG,GAAGN,eAE5BS,IAgBAlB,CAAAA,IAAAA,QATX,MAAA,WACWD,OAAAA,EAAEnE,QAAAA,IAAI,KAAKN,KAAM,cAAe,MAQhC0E,CAAAA,IAAAA,YALX,MAAA,WACW,OAAA,KAAK1E,SAIL0E,EA9ETA,GA8ESA,EAAAA,EAAAA,QAAAA,QAAAA;;AC7GR,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,gBAAA,QAAA,qBAAA,EALA,IAAMmB,EAAkB,SAAUC,EAAUlM,EAAOmM,GAClD/F,IAAAA,EAAO,CAAEpG,MAAOA,EAAOoM,YAAY,IAAI/I,MAAOgJ,UAAuB,IAAVF,EAAkB,GACjFG,aAAaC,QAAQL,EAASrK,WAAY2K,KAAKC,UAAUrG,KAGtD,QAAA,gBAAA,EAAA,IAAMsG,EAAkB,SAAUR,GACjC9F,IAAAA,EAAO,KACP,IACAA,EAAOoG,KAAKG,MAAML,aAAaM,QAAQV,EAASrK,aAClD,MAAMiB,GACG,OAAA,KAEPsD,GAAS,OAATA,EAAe,CACXA,KAAoB,OAApBA,EAAKgG,YAAuBhG,EAAKgG,YAAa,IAAI/I,MAAOgJ,WAGlDjG,OAAAA,EAAKpG,MAFZsM,aAAaO,WAAWX,EAASrK,YAKlC,OAAA,MAdJ,QAAA,gBAAA;;AC2CA,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,gBAAA,QAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,+BAAA,EAAA,EAAA,QAAA,4CAAA,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GA9CA,IAAMiL,EAAc,SAAUC,GAAKC,IAAAA,EAAS,UAAA,OAAA,QAAA,IAAA,UAAA,GAAA,UAAA,GAAA,MAG3CC,EAAU,IAAIC,eAGX,OAAA,IAAIC,QAAQ,SAAUC,EAASC,GAGlCJ,EAAQK,mBAAqB,WAGE,IAAvBL,EAAQM,aAGRN,EAAQO,QAAU,KAAOP,EAAQO,OAAS,IAE1CJ,EAAQH,GAGRI,EAAO,CACHG,OAAQP,EAAQO,OAChBC,WAAYR,EAAQQ,WACpBR,QAASA,MAOrBA,EAAQS,KAAKV,GAAU,MAAOD,GAAK,GAGnCE,EAAQU,UAaT,QAAA,YAAA,EARP,IAAMC,EAAuB,SAASC,GAC9B,IACOrB,OAAAA,KAAKG,MAAMkB,GACpB,MAAM/K,GACG+K,OAAAA,IAIFC,EAAe,WAAG,IAAA,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAef,EAAAA,GAAf,IAAA,EAAA,EAAA,EAAA,UAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAEDD,OAFqBE,EAAS,EAAA,OAAA,QAAA,IAAA,EAAA,GAAA,EAAA,GAAA,MAA7B,EAAA,KAAA,EAAA,EAAA,KAAA,EAEDF,EAAYC,EAAKC,GAFhB,KAAA,EAGhBY,OADDX,EAFiB,EAAA,KAGhBW,EAAAA,OAAAA,SAAAA,EAAqBX,EAAQc,eAHb,KAAA,EAKhBH,OALgB,EAAA,KAAA,EAAA,EAAA,GAAA,EAAA,MAAA,GAKhBA,EAAAA,OAAAA,SAAAA,EAAqB,EAAEX,GAAAA,QAAQc,eALf,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,EAAA,QAAlBD,OAAAA,SAAe,GAAA,OAAA,EAAA,MAAA,KAAA,YAAA,GAArB,QAAA,gBAAA;;ACkEA,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,aAAA,EAAA,QAAA,gBAAA,EAAA,QAAA,SAAA,EAAA,QAAA,aAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,kCAAA,EAAA,EAAA,QAAA,+BAAA,EAAA,EAAA,QAAA,4CAlHP,EAAA,EAAA,QAAA,oBACA,EAAA,QAAA,4BACA,EAAA,EAAA,QAAA,oBACA,EAAA,QAAA,aA+GO,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GA5GA,IAAME,GAA+BA,QAArBC,EAAAA,OAAOC,oBAAcF,IAAAA,OAAAA,EAAAA,EAAAA,UAAW,CACnDG,QAAS,2BACT3C,gBAAiB,CAAC,MAClB4C,wBAAyB,EACzBC,YAAa,uBAwGV,QAAA,QAAA,EArGP,IAAIC,EAAc,KAElB,SAASC,IACD,IAACD,EAAa,CAERvB,IAAAA,EAAMiB,EAAQG,QAAU,iDAE9BG,GAAc,EAAgBvB,EAAAA,iBAAAA,GAG3BuB,OAAAA,EAGIE,SAAAA,IAwFR,OAAA,EAAA,MAAA,KAAA,WAAA,SAAA,IAAA,OAxFP,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAKQR,GAJAS,GAAW,EACXC,GAAiB,GAGjBV,EAAQK,YALhB,CAAA,EAAA,KAAA,EAAA,MAOYK,KADJA,GAAiB,EAAgBV,EAAAA,iBAAAA,EAAQK,gBACnBK,EAAeC,MAP7C,CAAA,EAAA,KAAA,EAAA,MAQmBD,OAAAA,EAAAA,OAAAA,SAAAA,GARnB,KAAA,EAcyBH,OAdzB,EAAA,KAAA,EAAA,EAAA,KAAA,EAcyBA,IAdzB,KAAA,EAcQE,EAdR,EAAA,KAAA,EAAA,KAAA,GAAA,MAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GAAA,EAAA,MAAA,GAgBQA,EAAW,EAAIG,GAAAA,cAAf,EAAA,GAhBR,KAAA,GAoBQZ,IAAAA,EAAQK,YApBhB,CAAA,EAAA,KAAA,GAAA,MAsBY,GADJK,GAAiB,EAAgBV,EAAAA,iBAAAA,EAAQK,cACD,KAApC,QAAAK,EAAAA,SAAgBC,IAAAA,OAAAA,EAAOE,QAAPF,EAAAA,EAAAA,aAAOE,IAAAA,OAAAA,EAAAA,EAAAA,UAtBnC,CAAA,EAAA,KAAA,GAAA,MAuBmBH,OAAAA,EAAAA,OAAAA,SAAAA,GAvBnB,KAAA,IA2BwBV,EAAAA,EAAAA,iBAAAA,EAAQK,YAAaI,EAA4C,GAAlCT,EAAQI,wBAA+B,GAAK,IA3BnG,KAAA,GA8BWK,OAAAA,EAAAA,OAAAA,SAAAA,GA9BX,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,EAAA,UAwFO,MAAA,KAAA,WA9CA,SAASK,EAAaC,EAAQC,GAM7BA,OALAD,GAAuC,mBAAtBA,EAAOE,YACxBF,EAASA,EAAOE,cAGpBD,EAAmBA,GAAoBhB,EAAQI,yBACxB,GACnBtC,QAAQC,KAAK,gJACN,GAGJmD,EAAkBH,EAAQC,GAErC,SAASE,EAAkB9I,EAAM4I,GAUtB,OATF5I,IACDA,EAAO,IAENA,EAAKuI,QACNvI,EAAKuI,MAAQ,IAEjBvI,EAAKuI,MAAME,UAAW,GAENb,EAAAA,EAAAA,iBAAAA,EAAQK,YAAajI,EAAyB,GAAnB4I,EAAwB,GAAK,KACjE,EASJ,SAASG,IAEL,OADSnB,EAAAA,EAAAA,iBAAAA,EAAQK,YAAa,IAAK,IACnC,EAYWe,SAAAA,IAAf,OAAA,EAAA,MAAA,KAAA,WAAA,SAAA,IAAA,OAAA,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAA,IAAA,IAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACkBZ,OADlB,EAAA,KAAA,EACkBA,IADlB,KAAA,EASIO,OARHN,EADD,EAAA,KAGuB,YAAtB,EAAQA,EAAAA,SAAAA,KACR3C,QAAQuD,MAAM,oDAA6DZ,EAAAA,EAAAA,SAAAA,GAAWA,GACtFA,EAAW,CAAW,MAAA,CAAWA,MAAAA,GAAY,6DAG3CM,EAAS,IAAIjE,EAAJ,QAAW2D,EAAUT,EAAQxC,iBACrCuD,EAAAA,OAAAA,SAAAA,GATJ,KAAA,EAAA,IAAA,MAAA,OAAA,EAAA,SAAA,OAAA,MAAA,KAAA;;ACvEN,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,kBAAA,EAAA,QAAA,sBAAA,EAAA,QAAA,mBAAA,EAAA,QAAA,cAAA,EA3CM,IAAMO,EAAW,IAAInC,QAAQ,SAAAC,GACJ,YAAxBmC,SAAShC,WACLgC,SAASC,iBACTD,SAASC,iBAAiB,mBAAoBpC,GAE9CmC,SAASE,YAAY,qBAAsB,WACZ,WAAvBF,SAAShC,YACTH,MAKZA,MAID,SAASsC,EAAkBC,EAAI3P,GAC7B,IAAA,IAAImL,EAAI,EAAGA,EAAIwE,EAAG3B,QAAQ/N,OAAQkL,IAC/BwE,GAAAA,EAAG3B,QAAQ7C,GAAGnL,QAAUA,EAAO,CAC/B2P,EAAGC,cAAgBzE,EACnB,OAKL,SAAS0E,EAAsBF,EAAIG,EAAeC,GAChD,IAAA,IAAI5E,EAAI,EAAGA,EAAIwE,EAAG3B,QAAQ/N,OAAQkL,IAC/BwE,GAAAA,EAAG3B,QAAQ7C,GAAG6E,aAAaF,KAAmBC,EAAgB,CAC9DJ,EAAGC,cAAgBzE,EACnB,OAML,SAAS8E,EAAmBN,EAAItE,GAC/BkE,GAAAA,SAASW,YAAa,CAChBC,IAAAA,EAAQZ,SAASW,YAAY,cACnCC,EAAMC,UAAU/E,GAAM,GAAM,GAC5BsE,EAAGU,cAAcF,QAEjBR,EAAGW,UAAU,KAAOjF,GAE3B,QAAA,SAAA;;ACRA,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,YAAA,EAAA,QAAA,mBAAA,EAAA,QAAA,sBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,+BAAA,EAAA,EAAA,QAAA,4CAnCD,EAAA,QAAA,aAmCC,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GAhCM,SAASkF,EAAYZ,GAClBa,IAAAA,EAAMb,EAAGK,aAAa,gBACxB,IACOxD,OAAAA,KAAKG,MAAM6D,GACpB,MAAO1N,GACE,MAAA,IAIO2N,SAAAA,EAAAA,EAAAA,EAAAA,GAuBrB,OAAA,EAAA,MAAA,KAAA,WAAA,SAAA,IAAA,OAvBM,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAkCC,EAAAA,EAAWC,EAAcC,GAA3D,IAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAEEC,IADCA,EAAWtB,SAASuB,uBAAuBJ,IACnCzQ,OAFX,CAAA,EAAA,KAAA,EAAA,MAAA,OAAA,EAAA,OAAA,UAAA,KAAA,EAIkB,OAJlB,EAAA,KAAA,GAIkB,EAJlB,EAAA,YAAA,KAAA,EAMC8O,KAFEA,EAJH,EAAA,MAMQM,QANR,CAAA,EAAA,KAAA,EAAA,MAAA,OAOCvD,QAAQuD,MAAM,mCAAqCsB,EAAe,MAAQ5B,EAAOM,SAPlF,EAAA,OAAA,UAAA,KAAA,EAWHtO,MAAMgQ,KAAKF,GACNG,QAAQ,SAAArB,GAAMiB,OAAAA,EAASjB,EAAIZ,KAZ7B,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,OAuBN,MAAA,KAAA,WARM,SAASkC,EAAsBtB,EAAIZ,GAAQmC,IAAAA,EAAW,UAAA,OAAA,QAAA,IAAA,UAAA,GAAA,UAAA,GAAA,KACnDC,EAAMZ,EAAYZ,GAMjBZ,OALPmC,EAAWA,GAAYC,EAAID,SACvBC,EAAIC,YACJtF,QAAQC,KAAK,6LAGVgD,EAAOpD,iBAAiBuF,EAAUC,EAAIE,KAAMF,EAAIG;;ACV1D,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,oBAAA,EAAA,QAAA,mBAAA,EAAA,QAAA,4BAAA,EAAA,QAAA,wBAAA,EAxBD,IAAA,EAAA,QAAA,eACA,EAAA,QAAA,aAEO,SAASC,EAAoB5B,EAAIZ,GACpCY,EAAG6B,WAAY,EAAsB7B,EAAAA,uBAAAA,EAAIZ,GAGtC,SAAS0C,EAAmB9B,EAAIZ,GAC7B/C,IAAAA,EAAU+C,EAAO2C,oBAAqB,EAAY/B,EAAAA,aAAAA,GAAI2B,QACxDtF,GACA2D,EAAGgC,UAAUrN,IAAI,aAAe0H,GAIjC,SAAS4F,EAA4BjC,EAAIZ,GACxC/C,IAAAA,EAAU+C,EAAO2C,mBAEC/B,EAAAA,EAAAA,uBAAAA,EAAI,SAAU3D,IACjB2D,EAAAA,EAAAA,oBAAAA,EAAI,UAGpB,SAASkC,EAAwBlC,EAAIZ,GACxCY,EAAG3P,OAAQ,EAAsB2P,EAAAA,uBAAAA,EAAIZ,IAClBY,EAAAA,EAAAA,oBAAAA,EAAI;;AC4D1B,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,qBAAA,EAAA,QAAA,4CAAA,EAAA,IAAA,EAAA,EAAA,QAAA,kCAnFD,EAAA,QAAA,aACA,EAAA,EAAA,QAAA,qBAkFC,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GA/EM,SAASmC,EAAqBnC,EAAIZ,GAC/BoC,IAAAA,GAAM,EAAYxB,EAAAA,aAAAA,GAClBoC,EAAYC,EAA4Cb,EAAIc,OAAQd,EAAKpC,GAK3EY,EAAGuC,MAAMC,QAHRJ,EAGkB,GAFA,kBAMpB,SAASC,EAA4CC,EAAQd,EAAKpC,GAC/DqD,IAAAA,EAA2B,CAC7B,OACA,WACA,YACA,OACA,cAGAC,EAAqC,OAAdJ,EAAOK,GA0C3BD,OAxCPJ,EAAOM,WAAWvB,QAAQ,SAAAwB,GAClBC,IAAAA,GAAuB,EACvBrO,EAAS,GAEPsO,EAAY3D,EAAO4D,QAAQH,EAAEI,GAEjB,OAAdF,EACAD,GAAuB,EAEI,YAAvB,EAAQC,EAAAA,SAAAA,GACRN,EAAyBpB,QAAQ,SAAA3F,GACzBqH,EAAUrH,GACVjH,EAAOgD,KAAKsL,EAAUrH,IACP,QAARA,GACPjH,EAAOgD,KAAK2H,EAAOpD,iBAAiB6G,EAAEI,EAAGzB,EAAIE,SAIrDjN,EAAS,CAACsO,GAIlBD,EAAuBI,EAA2CL,EAAEM,EAAG1O,GAEnEoO,EAAEO,MACFN,GAAwBA,GAIxBJ,EADc,OAAdJ,EAAOK,GACeD,GAAuBI,EAEvBJ,GAAuBI,IAKjDR,EAAOc,MACPV,GAAuBA,GAGpBA,EAGX,SAASQ,EAA2CG,EAAgBC,GAazDC,OAZiB,IAApBD,EAAa,GACbA,EAAe,CAAC,OAAQ,MAAO,IAAK,MACT,IAApBA,EAAa,KACpBA,EAAe,CAAC,QAAS,KAAM,IAAK,IAAK,KAG7CA,EAAeA,EAAa9M,IAAI,SAAAgN,GAAKC,OAAAA,OAAOD,GAAG5H,gBAE/CyH,EAAiBA,EAAeK,MAAM,KAEpBxI,EAAEhC,QAAAA,aAAamK,EAAgBC,GAEhChT,OAAS;;AC5EvB,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,mBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,+BAAA,EAAA,EAAA,QAAA,4CANP,EAAA,QAAA,eACA,EAAA,QAAA,aACA,EAAA,QAAA,YACA,EAAA,QAAA,aAGO,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GAAA,IAAMqT,EAAa,WAAG,IAAA,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAA,IAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACnBhE,OADmB,EAAA,KAAA,EACnBA,EADmB,SAAA,KAAA,GAIN,EAAA,EAAA,oBAAA,4BACf,iDAAkDiC,EADtD,sBAGmB,EAAA,EAAA,oBAAA,uBACf,kCAAmCE,EADvC,qBAGmB,EAAA,EAAA,oBAAA,sBACf,qDAAsDI,EAD1D,0BAGmB,EAAA,EAAA,oBAAA,iCACf,iDAAkDD,EADtD,8BAGmB,EAAA,EAAA,oBAAA,0BACf,mDAAoDE,EADxD,sBAhByB,KAAA,EAAA,IAAA,MAAA,OAAA,EAAA,SAAA,MAAewB,OAAAA,WAAlB,OAAA,EAAA,MAAA,KAAA,YAAA,GAAnB,QAAA,cAAA;;ACHA,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,+BAAA,EAAA,EAAA,QAAA,4CAHP,EAAA,QAAA,cACA,EAAA,QAAA,YAEO,SAAA,EAAA,GAAA,OAAA,GAAA,EAAA,WAAA,EAAA,CAAA,QAAA,GAAeC,SAAAA,IAAf,OAAA,EAAA,MAAA,KAAA,WAAA,SAAA,IAAA,OAAA,GAAA,EAAA,EAAA,SAAA,EAAA,QAAA,KAAA,SAAA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACkB,OADlB,EAAA,KAAA,GACkB,EADlB,EAAA,YAAA,KAAA,EAGCxE,KAFEA,EADH,EAAA,MAGQM,QAHR,CAAA,EAAA,KAAA,EAAA,MAAA,OAICvD,QAAQuD,MAAM,sDAAwDN,EAAOM,SAJ9E,EAAA,OAAA,UAAA,KAAA,EAeGC,OAPAkE,EAAc,CAChBxH,QAAS+C,EAAOrI,IAAI,oBACYqI,+BAAAA,EAAO0E,aAAa,iCAAmC1E,EAAOrI,IAAI,gCAClGgN,UAAW3E,EAAOrI,IAAI,kBACtBiN,SAAU5E,EAAOrI,IAAI,uCAZtB,EAAA,KAAA,EAeG4I,EAfH,SAAA,KAAA,EAkBalQ,IADVwU,EAAOrE,SAASsE,qBAAqB,QAAQ,GACnCzU,EAAAA,EAAAA,EAAAA,OAAO6C,KAAKuR,GAAc,EAAA,EAAA,OAAA,IAAjCpS,EAAiC,EAAA,IAChCpB,EAAQwT,EAAYpS,MAEA,iBAAVpB,EACR4T,EAAKjC,UAAUrN,IAAalD,SAAAA,OAAAA,EAAOpB,KAAAA,OAAAA,IAEnC4T,EAAKjC,UAAUrN,IAAalD,SAAAA,OAAAA,KAxBrC,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,OAAA,MAAA,KAAA;;ACcP,aAjBA,IAAA,EAAA,QAAA,YACA,EAAA,QAAA,sBACA,EAAA,QAAA,kBAII4M,EAAQ8F,QAAAA,kBACR,EAAA,EAAA,oBAEA9F,EAAQsF,QAAAA,gBACR,EAAA,EAAA,iBAIJrF,OAAOC,aAAakB,SAAWA,EAA/B,SAEAnB,OAAOC,aAAaY,aAAeA,EAAnC,aACAb,OAAOC,aAAaiB,gBAAkBA,EAAtC","file":"frontend.2e78f904.js","sourceRoot":"../..","sourcesContent":["function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","/**\n * @license\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash include=\"get,intersection\" -o js/lodash.custom.js`\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.5';\n\n /** Error message constants. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n /** `Object#toString` result references. */\n var asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n nullTag = '[object Null]',\n proxyTag = '[object Proxy]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]';\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = root['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Symbol = root.Symbol,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now;\n\n /* Built-in method references that are verified to be native. */\n var Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash() {\n // No operation performed.\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.constant = constant;\n lodash.intersection = intersection;\n lodash.memoize = memoize;\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.eq = eq;\n lodash.get = get;\n lodash.identity = identity;\n lodash.isArray = isArray;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isFunction = isFunction;\n lodash.isLength = isLength;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isSymbol = isSymbol;\n lodash.toString = toString;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n /*--------------------------------------------------------------------------*/\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = lodash;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return lodash;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = lodash)._ = lodash;\n // Export for CommonJS support.\n freeExports._ = lodash;\n }\n else {\n // Export to the global object.\n root._ = lodash;\n }\n}.call(this));\n","\nimport _ from '../lodash.custom';\n\n\nconst _get_localized = function(ret, locales) {\n if (typeof(ret) === 'object') {\n \n if (typeof(locales) === 'string') {\n locales = [ locales ];\n }\n if (typeof(locales) !== 'object') {\n locales = [];\n }\n\n if (typeof(ret.names) === 'object') {\n for (let i = 0 ; i < locales.length ; i++) {\n let locale = locales[i];\n\n if (ret.names[locale]) {\n return ret.names[locale];\n }\n }\n }\n\n if (ret.name) {\n return ret.name;\n }\n }\n return ret;\n}\n\nexport const camelToUnderscore = function(key) {\n // Tolerate PascalCase. But _key stays _key [ (?<=[a-z0-9]) means Look-ahead]\n return key.replace(/(?<=[a-z0-9])([A-Z])/g, \"_$1\").toLowerCase();\n}\n\nclass Record {\n data = {};\n default_locales = [];\n\n constructor(data, default_locales) {\n this.data = data || {};\n this.default_locales = default_locales || ['en']; \n }\n\n get(prop, default_value) {\n return this.get_with_locales(prop, null, default_value);\n }\n\n get_raw(prop) {\n prop = camelToUnderscore(prop);\n return _.get(this.data, prop, null);\n }\n \n has_property(prop) {\n const ret = this._lookup_with_locales(prop, this.default_locales)\n return typeof(ret) !== 'undefined';\n }\n\n _lookup_with_locales(prop, locales, default_value = '') {\n prop = camelToUnderscore(prop);\n \n // Treat pseudo-property 'name' as if it never existed\n if (prop.substr(-5) === '.name') {\n prop = prop.substr(0, prop.length - 5);\n }\n \n let ret = _.get(this.data, prop, default_value);\n \n // Localize property, if possible\n ret = _get_localized(ret, locales);\n\n return ret;\n }\n \n get_with_locales(prop, locales, default_value) {\n if (!Array.isArray(locales) || locales.length === 0) {\n locales = this.default_locales;\n }\n\n const ret = this._lookup_with_locales(prop, locales, default_value);\n\n if (typeof(ret) === 'object') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is of type \"' + typeof (ret) + '\", should be string or similar', ret)\n }\n if (typeof(ret) === 'undefined') {\n console.warn('Geolocation IP Detection: The property \"' + prop + '\" is not defined, please check spelling or maybe you need a different data source', { data: this.data })\n return '';\n }\n\n return ret;\n }\n\n get_country_iso() {\n let country = this.get('country.iso_code');\n if(country) {\n country = country.substr(0, 2).toLowerCase();\n }\n return country;\n }\n \n /**\n * Get error message, if any\n * @return string Error Message\n */\n error() {\n return _.get(this.data, 'extra.error', '');\n }\n\n serialize() {\n return this.data;\n }\n}\n\nexport default Record;","export const setLocalStorage = function (variable, value, ttl_sec) {\n var data = { value: value, expires_at: new Date().getTime() + (ttl_sec * 1000) / 1 };\n localStorage.setItem(variable.toString(), JSON.stringify(data));\n};\n\nexport const getLocalStorage = function (variable) {\n let data = null;\n try {\n data = JSON.parse(localStorage.getItem(variable.toString()));\n } catch(e) {\n return null;\n }\n if (data !== null) {\n if (data.expires_at !== null && data.expires_at < new Date().getTime()) {\n localStorage.removeItem(variable.toString());\n } else {\n return data.value;\n }\n }\n return null;\n}\n","// @see https://gomakethings.com/promise-based-xhr/\n\nexport const makeRequest = function (url, method = 'GET') {\n\n // Create the XHR request\n var request = new XMLHttpRequest();\n\n // Return it as a Promise\n return new Promise(function (resolve, reject) {\n\n // Setup our listener to process compeleted requests\n request.onreadystatechange = function () {\n\n // Only run if the request is complete\n if (request.readyState !== 4) return;\n\n // Process the response\n if (request.status >= 200 && request.status < 300) {\n // If successful\n resolve(request);\n } else {\n // If failed\n reject({\n status: request.status,\n statusText: request.statusText,\n request: request\n });\n }\n\n };\n\n // Setup our HTTP request\n request.open(method || 'GET', url, true);\n\n // Send the request\n request.send();\n\n });\n};\n\nconst jsonDecodeIfPossible = function(str) {\n try {\n return JSON.parse(str);\n } catch(e) {\n return str;\n }\n}\n\nexport const makeJSONRequest = async function(url, method = 'GET') {\n try {\n const request = await makeRequest(url, method);\n return jsonDecodeIfPossible(request.responseText);\n } catch(e) {\n return jsonDecodeIfPossible(e.request.responseText);\n }\n}\n","import Record from './models/record';\nimport { getLocalStorage, setLocalStorage } from './lib/localStorageAccess';\nimport _ from './lodash.custom';\nimport { makeJSONRequest } from './lib/xhr';\n\n\nexport const options = window.geoip_detect?.options || {\n ajaxurl: \"/wp-admin/admin-ajax.php\",\n default_locales: ['en'],\n cookie_duration_in_days: 7,\n cookie_name: 'geoip-detect-result'\n};\n\nlet ajaxPromise = null;\n\nfunction get_info_raw() {\n if (!ajaxPromise) {\n // Do Ajax Request only once per page load\n const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'\n\n ajaxPromise = makeJSONRequest(url);\n }\n\n return ajaxPromise;\n}\n\nasync function get_info_cached() {\n let response = false;\n let storedResponse = false;\n\n // 1) Load Info from localstorage cookie cache, if possible\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse && storedResponse.extra) {\n return storedResponse;\n }\n }\n\n // 2) Get response\n try {\n response = await get_info_raw();\n } catch (err) {\n response = err.responseJSON || err;\n }\n\n // 3) Save info to localstorage cookie cache\n if (options.cookie_name) {\n storedResponse = getLocalStorage(options.cookie_name)\n if (storedResponse?.extra?.override === true) {\n return storedResponse;\n }\n\n // This might be an error object - cache it anyway\n setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60);\n }\n\n return response;\n}\n\n\n/**\n * This functions allows to override the geodetected data manually (e.g. a country selector)\n * \n * @api\n * @param {*} record \n * @param {number} duration_in_days When this override expires (default: 1 week later)\n * @return boolean\n */\nexport function set_override(record, duration_in_days) {\n if (record && typeof(record.serialize) === 'function') {\n record = record.serialize();\n }\n\n duration_in_days = duration_in_days || options.cookie_duration_in_days;\n if (duration_in_days < 0) {\n console.warn('set_override_data() did nothing: A negative duration doesn\\'t make sense. If you want to remove the override, use remove_override() instead.');\n return false;\n }\n\n return set_override_data(record, duration_in_days);\n}\nfunction set_override_data(data, duration_in_days) {\n if (!data) {\n data = {};\n }\n if (!data.extra) {\n data.extra = {};\n }\n data.extra.override = true;\n\n setLocalStorage(options.cookie_name, data, duration_in_days * 24 * 60 * 60);\n return true;\n}\n\n/**\n * Remove the override data.\n * On next page load, the record data will be loaded from the server again.\n * \n * @return boolean\n */\nexport function remove_override() {\n setLocalStorage(options.cookie_name, {}, -1);\n return true;\n}\n\n\n/**\n * Load the data from the server\n * \n * (It can also be loaded from the browser localstorage, if the record data is present there already.)\n * \n * @api\n * @return Promise(Record)\n */\nexport async function get_info() {\n let response = await get_info_cached();\n\n if (typeof (response) !== 'object') {\n console.error('Geoip-detect: Record should be an object, not a ' + typeof (response), response);\n response = { 'extra': { 'error': response || 'Network error, look at the original server response ...' } };\n }\n\n const record = new Record(response, options.default_locales);\n return record;\n}","export const domReady = new Promise(resolve => {\n if (document.readyState === \"loading\") {\n if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', resolve);\n } else {\n document.attachEvent('onreadystatechange', function () {\n if (document.readyState != 'loading')\n resolve();\n });\n }\n }\n else {\n resolve();\n }\n});\n\nexport function selectItemByValue(el, value) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].value === value) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\nexport function selectItemByAttribute(el, attributeName, attributeValue) {\n for (var i = 0; i < el.options.length; i++) {\n if (el.options[i].getAttribute(attributeName) === attributeValue) {\n el.selectedIndex = i;\n break;\n }\n }\n}\n\n\nexport function triggerNativeEvent(el, name) {\n if (document.createEvent) {\n const event = document.createEvent('HTMLEvents');\n event.initEvent(name, true, false);\n el.dispatchEvent(event);\n } else {\n el.fireEvent('on' + name);\n }\n}","import { get_info } from \"../lookup\";\n\n// Get Options from data-options and json parse them\nexport function get_options(el) {\n const raw = el.getAttribute('data-options');\n try {\n return JSON.parse(raw);\n } catch (e) {\n return {};\n }\n}\n\nexport async function action_on_elements(className, errorMessage, callback) {\n const elements = document.getElementsByClassName(className);\n if (!elements.length) return;\n\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geolocation IP Detection Error (' + errorMessage + '): ' + record.error());\n return;\n }\n\n Array.from(elements)\n .forEach(el => callback(el, record));\n}\n\nexport function get_value_from_record(el, record, property = null) {\n const opt = get_options(el);\n property = property || opt.property;\n if (opt.skip_cache) {\n console.warn(\"Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME.\");\n }\n\n return record.get_with_locales(property, opt.lang, opt.default);\n}","import { selectItemByAttribute, triggerNativeEvent } from \"../lib/html\";\nimport { get_value_from_record, get_options } from \"./helpers\";\n\nexport function do_shortcode_normal(el, record) {\n el.innerText = get_value_from_record(el, record);\n}\n\nexport function do_shortcode_flags(el, record) {\n const country = record.get_country_iso() || get_options(el).default;\n if (country) {\n el.classList.add('flag-icon-' + country)\n }\n}\n\nexport function do_shortcode_country_select(el, record) {\n let country = record.get_country_iso();\n\n selectItemByAttribute(el, 'data-c', country);\n triggerNativeEvent(el, 'change');\n}\n\nexport function do_shortcode_text_input(el, record) {\n el.value = get_value_from_record(el, record);\n triggerNativeEvent(el, 'change');\n}","import { get_options } from './helpers';\nimport _ from '../lodash.custom'; // we might use lodash-es in the future\n\n\nexport function do_shortcode_show_if(el, record) {\n const opt = get_options(el);\n const evaluated = geoip_detect2_shortcode_evaluate_conditions(opt.parsed, opt, record);\n\n if (!evaluated) {\n el.style.display = \"none !important\";\n } else {\n el.style.display = '';\n }\n}\n\nexport function geoip_detect2_shortcode_evaluate_conditions(parsed, opt, record) {\n const alternativePropertyNames = [\n 'name',\n 'iso_code',\n 'iso_code3',\n 'code',\n 'geoname_id',\n ];\n\n let isConditionMatching = (parsed.op === 'or') ? false : true;\n\n parsed.conditions.forEach(c => {\n let subConditionMatching = false;\n let values = [];\n\n const raw_value = record.get_raw(c.p);\n\n if (raw_value === null) {\n subConditionMatching = false;\n } else {\n if (typeof (raw_value) === 'object') {\n alternativePropertyNames.forEach(name => {\n if (raw_value[name]) {\n values.push(raw_value[name]);\n } else if (name == 'name') {\n values.push(record.get_with_locales(c.p, opt.lang));\n }\n })\n } else {\n values = [raw_value]\n }\n }\n\n subConditionMatching = geoip_detect2_shortcode_check_subcondition(c.v, values);\n\n if (c.not) {\n subConditionMatching = !subConditionMatching;\n }\n\n if (parsed.op === 'or') {\n isConditionMatching = isConditionMatching || subConditionMatching;\n } else {\n isConditionMatching = isConditionMatching && subConditionMatching;\n }\n\n });\n\n if (parsed.not) {\n isConditionMatching = !isConditionMatching;\n }\n\n return isConditionMatching;\n}\n\nfunction geoip_detect2_shortcode_check_subcondition(expectedValues, actualValues) {\n if (actualValues[0] === true) {\n actualValues = ['true', 'yes', 'y', '1'];\n } else if (actualValues[0] === false) {\n actualValues = ['false', 'no', 'n', '0', ''];\n }\n\n actualValues = actualValues.map(x => String(x).toLowerCase())\n\n expectedValues = expectedValues.split(',');\n\n const intersect = _.intersection(expectedValues, actualValues);\n\n return intersect.length > 0;\n}","import { domReady } from \"../lib/html\";\nimport { action_on_elements } from \"./helpers\";\nimport { do_shortcode_country_select, do_shortcode_flags, do_shortcode_normal, do_shortcode_text_input } from \"./normal\";\nimport { do_shortcode_show_if } from \"./show-if\";\n\n\nexport const do_shortcodes = async function do_shortcodes() {\n await domReady;\n\n // These are called in parallel, as they are async functions\n action_on_elements('js-geoip-detect-shortcode',\n 'could not execute shortcode(s) [geoip_detect2]', do_shortcode_normal);\n\n action_on_elements('js-geoip-detect-flag',\n 'could not configure the flag(s)', do_shortcode_flags);\n\n action_on_elements('js-geoip-text-input',\n 'could not set the value of the text input field(s)', do_shortcode_text_input);\n\n action_on_elements('js-geoip-detect-country-select',\n 'could not set the value of the select field(s)', do_shortcode_country_select);\n\n action_on_elements('js-geoip-detect-show-if',\n 'could not execute the show-if/hide-if conditions', do_shortcode_show_if);\n\n};","import { domReady } from './lib/html';\nimport { get_info } from './lookup';\n\nexport async function add_body_classes() {\n const record = await get_info();\n\n if (record.error()) {\n console.error('Geodata Error (could not add CSS-classes to body): ' + record.error());\n return;\n }\n\n const css_classes = {\n country: record.get('country.iso_code'),\n 'country-is-in-european-union': record.has_property('country.is_in_european_union') && record.get('country.is_in_european_union'),\n continent: record.get('continent.code'),\n province: record.get('most_specific_subdivision.iso_code'),\n };\n\n await domReady;\n\n const body = document.getElementsByTagName('body')[0];\n for (let key of Object.keys(css_classes)) {\n const value = css_classes[key];\n if (value) {\n if (typeof (value) == 'string') {\n body.classList.add(`geoip-${key}-${value}`);\n } else {\n body.classList.add(`geoip-${key}`);\n }\n }\n }\n}","import { get_info, options, remove_override, set_override } from './lookup';\nimport { do_shortcodes } from './shortcodes/index';\nimport { add_body_classes } from './body_classes';\n\n\n\nif (options.do_body_classes) {\n add_body_classes();\n}\nif (options.do_shortcodes) {\n do_shortcodes();\n}\n\n// Extend window object \nwindow.geoip_detect.get_info = get_info;\n\nwindow.geoip_detect.set_override = set_override;\nwindow.geoip_detect.remove_override = remove_override;"]}
js/dist/parcel.js CHANGED
@@ -1,3 +1,3 @@
1
  parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
2
- module.exports={frontendJS:"frontend.81866894.js",backendJS:"backend.f84e1103.js"};
3
- },{"./js/frontend.js":[["frontend.81866894.js","ZVsn"],"frontend.81866894.js.map","ZVsn"],"./js/backend.js":[["backend.f84e1103.js","gP7L"],"backend.f84e1103.js.map","gP7L"]}]},{},[], null)
1
  parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"mzZo":[function(require,module,exports) {
2
+ module.exports={frontendJS:"frontend.2e78f904.js",backendJS:"backend.f84e1103.js"};
3
+ },{"./js/frontend.js":[["frontend.2e78f904.js","ZVsn"],"frontend.2e78f904.js.map","ZVsn"],"./js/backend.js":[["backend.f84e1103.js","gP7L"],"backend.f84e1103.js.map","gP7L"]}]},{},[], null)
js/dist/parcel.json CHANGED
@@ -1,4 +1,4 @@
1
  {
2
- "frontendJS": "frontend.81866894.js",
3
  "backendJS": "backend.f84e1103.js"
4
  }
1
  {
2
+ "frontendJS": "frontend.2e78f904.js",
3
  "backendJS": "backend.f84e1103.js"
4
  }
js/dist/parcel.urls CHANGED
@@ -1,2 +1,2 @@
1
- frontendJS: frontend.81866894.js
2
  backendJS: backend.f84e1103.js
1
+ frontendJS: frontend.2e78f904.js
2
  backendJS: backend.f84e1103.js
js/frontend.js CHANGED
@@ -1,95 +1,18 @@
1
- import Record from './models/record';
2
- import { getLocalStorage, setLocalStorage } from './localStorageAccess';
3
- import _ from './lodash.custom';
4
- import { makeJSONRequest } from './xhr';
5
 
6
- if (!window.geoip_detect) {
7
- console.error('Geoip-detect: the JS variable window.geoip_detect is missing - this is needed for the options')
8
- }
9
- const options = window.geoip_detect.options || {};
10
-
11
- let ajaxPromise = null;
12
-
13
- function get_info_raw() {
14
- if (!ajaxPromise) {
15
- // Do Ajax Request only once per page load
16
- const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'
17
-
18
- ajaxPromise = makeJSONRequest(url);
19
- }
20
-
21
- return ajaxPromise;
22
- }
23
-
24
- async function get_info_cached() {
25
- let response = false;
26
-
27
- // 1) Load Info from cookie cache, if possible
28
- if (options.cookie_name) {
29
- response = getLocalStorage(options.cookie_name)
30
- if (response && response.extra) {
31
- // This might be an error object - cache it anyway
32
- return response;
33
- }
34
- }
35
-
36
- // 2) Get response
37
- try {
38
- response = await get_info_raw();
39
- } catch(err) {
40
- response = err.responseJSON || err;
41
- }
42
-
43
- // 3) Save info to cookie cache
44
- if (options.cookie_name) {
45
- setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60)
46
- }
47
-
48
- return response;
49
- }
50
-
51
-
52
- export async function get_info() {
53
- let response = await get_info_cached();
54
-
55
- if (typeof(response) !== 'object') {
56
- console.error('Geoip-detect: Record should be an object, not a ' + typeof(response), response);
57
- response = { 'extra': { 'error': response || 'Network error, look at the original server response ...' }};
58
- }
59
-
60
- const record = new Record(response, options.default_locales);
61
- return record;
62
- }
63
 
64
- async function add_body_classes() {
65
- const record = await get_info();
66
 
67
- if (record.error()) {
68
- console.error('Geodata Error (could not add CSS-classes to body): ' + record.error());
69
- }
70
-
71
- const css_classes = {
72
- country: record.get('country.iso_code'),
73
- 'country-is-in-european-union': record.get('country.is_in_european_union'),
74
- continent: record.get('continent.code'),
75
- province: record.get('most_specific_subdivision.iso_code'),
76
- };
77
-
78
- const body = document.getElementsByTagName('body')[0];
79
- for(let key of Object.keys(css_classes)) {
80
- const value = css_classes[key];
81
- if (value) {
82
- if (typeof(value) == 'string') {
83
- body.classList.add(`geoip-${key}-${value}`);
84
- } else {
85
- body.classList.add(`geoip-${key}`);
86
- }
87
- }
88
- }
89
- }
90
  if (options.do_body_classes) {
91
  add_body_classes();
92
  }
 
 
 
93
 
94
  // Extend window object
95
- window.geoip_detect.get_info = get_info;
 
 
 
1
+ import { get_info, options, remove_override, set_override } from './lookup';
2
+ import { do_shortcodes } from './shortcodes/index';
3
+ import { add_body_classes } from './body_classes';
 
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
 
 
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  if (options.do_body_classes) {
8
  add_body_classes();
9
  }
10
+ if (options.do_shortcodes) {
11
+ do_shortcodes();
12
+ }
13
 
14
  // Extend window object
15
+ window.geoip_detect.get_info = get_info;
16
+
17
+ window.geoip_detect.set_override = set_override;
18
+ window.geoip_detect.remove_override = remove_override;
js/lib/html.js ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const domReady = new Promise(resolve => {
2
+ if (document.readyState === "loading") {
3
+ if (document.addEventListener) {
4
+ document.addEventListener('DOMContentLoaded', resolve);
5
+ } else {
6
+ document.attachEvent('onreadystatechange', function () {
7
+ if (document.readyState != 'loading')
8
+ resolve();
9
+ });
10
+ }
11
+ }
12
+ else {
13
+ resolve();
14
+ }
15
+ });
16
+
17
+ export function selectItemByValue(el, value) {
18
+ for (var i = 0; i < el.options.length; i++) {
19
+ if (el.options[i].value === value) {
20
+ el.selectedIndex = i;
21
+ break;
22
+ }
23
+ }
24
+ }
25
+
26
+ export function selectItemByAttribute(el, attributeName, attributeValue) {
27
+ for (var i = 0; i < el.options.length; i++) {
28
+ if (el.options[i].getAttribute(attributeName) === attributeValue) {
29
+ el.selectedIndex = i;
30
+ break;
31
+ }
32
+ }
33
+ }
34
+
35
+
36
+ export function triggerNativeEvent(el, name) {
37
+ if (document.createEvent) {
38
+ const event = document.createEvent('HTMLEvents');
39
+ event.initEvent(name, true, false);
40
+ el.dispatchEvent(event);
41
+ } else {
42
+ el.fireEvent('on' + name);
43
+ }
44
+ }
js/lib/localStorageAccess.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const setLocalStorage = function (variable, value, ttl_sec) {
2
+ var data = { value: value, expires_at: new Date().getTime() + (ttl_sec * 1000) / 1 };
3
+ localStorage.setItem(variable.toString(), JSON.stringify(data));
4
+ };
5
+
6
+ export const getLocalStorage = function (variable) {
7
+ let data = null;
8
+ try {
9
+ data = JSON.parse(localStorage.getItem(variable.toString()));
10
+ } catch(e) {
11
+ return null;
12
+ }
13
+ if (data !== null) {
14
+ if (data.expires_at !== null && data.expires_at < new Date().getTime()) {
15
+ localStorage.removeItem(variable.toString());
16
+ } else {
17
+ return data.value;
18
+ }
19
+ }
20
+ return null;
21
+ }
js/lib/xhr.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // @see https://gomakethings.com/promise-based-xhr/
2
+
3
+ export const makeRequest = function (url, method = 'GET') {
4
+
5
+ // Create the XHR request
6
+ var request = new XMLHttpRequest();
7
+
8
+ // Return it as a Promise
9
+ return new Promise(function (resolve, reject) {
10
+
11
+ // Setup our listener to process compeleted requests
12
+ request.onreadystatechange = function () {
13
+
14
+ // Only run if the request is complete
15
+ if (request.readyState !== 4) return;
16
+
17
+ // Process the response
18
+ if (request.status >= 200 && request.status < 300) {
19
+ // If successful
20
+ resolve(request);
21
+ } else {
22
+ // If failed
23
+ reject({
24
+ status: request.status,
25
+ statusText: request.statusText,
26
+ request: request
27
+ });
28
+ }
29
+
30
+ };
31
+
32
+ // Setup our HTTP request
33
+ request.open(method || 'GET', url, true);
34
+
35
+ // Send the request
36
+ request.send();
37
+
38
+ });
39
+ };
40
+
41
+ const jsonDecodeIfPossible = function(str) {
42
+ try {
43
+ return JSON.parse(str);
44
+ } catch(e) {
45
+ return str;
46
+ }
47
+ }
48
+
49
+ export const makeJSONRequest = async function(url, method = 'GET') {
50
+ try {
51
+ const request = await makeRequest(url, method);
52
+ return jsonDecodeIfPossible(request.responseText);
53
+ } catch(e) {
54
+ return jsonDecodeIfPossible(e.request.responseText);
55
+ }
56
+ }
js/lodash.custom.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * @license
3
  * Lodash (Custom Build) <https://lodash.com/>
4
- * Build: `lodash include="get" -o js/lodash.custom.js`
5
  * Copyright JS Foundation and other contributors <https://js.foundation/>
6
  * Released under MIT license <https://lodash.com/license>
7
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -24,8 +24,13 @@
24
  /** Used as the maximum memoize cache size. */
25
  var MAX_MEMOIZE_SIZE = 500;
26
 
 
 
 
 
27
  /** Used as references for various `Number` constants. */
28
- var INFINITY = 1 / 0;
 
29
 
30
  /** `Object#toString` result references. */
31
  var asyncTag = '[object AsyncFunction]',
@@ -70,6 +75,61 @@
70
 
71
  /*--------------------------------------------------------------------------*/
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  /**
74
  * A specialized version of `_.map` for arrays without support for iteratee
75
  * shorthands.
@@ -90,6 +150,80 @@
90
  return result;
91
  }
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  /**
94
  * Gets the value at `key` of `object`.
95
  *
@@ -102,6 +236,28 @@
102
  return object == null ? undefined : object[key];
103
  }
104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  /*--------------------------------------------------------------------------*/
106
 
107
  /** Used for built-in method references. */
@@ -142,6 +298,19 @@
142
  splice = arrayProto.splice,
143
  symToStringTag = Symbol ? Symbol.toStringTag : undefined;
144
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  /* Built-in method references that are verified to be native. */
146
  var Map = getNative(root, 'Map'),
147
  nativeCreate = getNative(Object, 'create');
@@ -602,6 +771,58 @@
602
 
603
  /*------------------------------------------------------------------------*/
604
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  /**
606
  * Gets the index at which the `key` is found in `array` of key-value pairs.
607
  *
@@ -656,6 +877,69 @@
656
  : objectToString(value);
657
  }
658
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  /**
660
  * The base implementation of `_.isNative` without bad shim checks.
661
  *
@@ -672,6 +956,35 @@
672
  return pattern.test(toSource(value));
673
  }
674
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
675
  /**
676
  * The base implementation of `_.toString` which doesn't convert nullish
677
  * values to empty strings.
@@ -696,6 +1009,17 @@
696
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
697
  }
698
 
 
 
 
 
 
 
 
 
 
 
 
699
  /**
700
  * Casts `value` to a path array if it's not one.
701
  *
@@ -843,6 +1167,75 @@
843
  return nativeObjectToString.call(value);
844
  }
845
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
846
  /**
847
  * Converts `string` to a property path array.
848
  *
@@ -897,6 +1290,32 @@
897
 
898
  /*------------------------------------------------------------------------*/
899
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
900
  /**
901
  * Creates a function that memoizes the result of `func`. If `resolver` is
902
  * provided, it determines the cache key for storing the result based on the
@@ -1027,6 +1446,64 @@
1027
  */
1028
  var isArray = Array.isArray;
1029
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1030
  /**
1031
  * Checks if `value` is classified as a `Function` object.
1032
  *
@@ -1054,6 +1531,37 @@
1054
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
1055
  }
1056
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1057
  /**
1058
  * Checks if `value` is the
1059
  * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
@@ -1193,7 +1701,56 @@
1193
 
1194
  /*------------------------------------------------------------------------*/
1195
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1196
  // Add methods that return wrapped values in chain sequences.
 
 
1197
  lodash.memoize = memoize;
1198
 
1199
  /*------------------------------------------------------------------------*/
@@ -1201,8 +1758,12 @@
1201
  // Add methods that return unwrapped values in chain sequences.
1202
  lodash.eq = eq;
1203
  lodash.get = get;
 
1204
  lodash.isArray = isArray;
 
 
1205
  lodash.isFunction = isFunction;
 
1206
  lodash.isObject = isObject;
1207
  lodash.isObjectLike = isObjectLike;
1208
  lodash.isSymbol = isSymbol;
1
  /**
2
  * @license
3
  * Lodash (Custom Build) <https://lodash.com/>
4
+ * Build: `lodash include="get,intersection" -o js/lodash.custom.js`
5
  * Copyright JS Foundation and other contributors <https://js.foundation/>
6
  * Released under MIT license <https://lodash.com/license>
7
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
24
  /** Used as the maximum memoize cache size. */
25
  var MAX_MEMOIZE_SIZE = 500;
26
 
27
+ /** Used to detect hot functions by number of calls within a span of milliseconds. */
28
+ var HOT_COUNT = 800,
29
+ HOT_SPAN = 16;
30
+
31
  /** Used as references for various `Number` constants. */
32
+ var INFINITY = 1 / 0,
33
+ MAX_SAFE_INTEGER = 9007199254740991;
34
 
35
  /** `Object#toString` result references. */
36
  var asyncTag = '[object AsyncFunction]',
75
 
76
  /*--------------------------------------------------------------------------*/
77
 
78
+ /**
79
+ * A faster alternative to `Function#apply`, this function invokes `func`
80
+ * with the `this` binding of `thisArg` and the arguments of `args`.
81
+ *
82
+ * @private
83
+ * @param {Function} func The function to invoke.
84
+ * @param {*} thisArg The `this` binding of `func`.
85
+ * @param {Array} args The arguments to invoke `func` with.
86
+ * @returns {*} Returns the result of `func`.
87
+ */
88
+ function apply(func, thisArg, args) {
89
+ switch (args.length) {
90
+ case 0: return func.call(thisArg);
91
+ case 1: return func.call(thisArg, args[0]);
92
+ case 2: return func.call(thisArg, args[0], args[1]);
93
+ case 3: return func.call(thisArg, args[0], args[1], args[2]);
94
+ }
95
+ return func.apply(thisArg, args);
96
+ }
97
+
98
+ /**
99
+ * A specialized version of `_.includes` for arrays without support for
100
+ * specifying an index to search from.
101
+ *
102
+ * @private
103
+ * @param {Array} [array] The array to inspect.
104
+ * @param {*} target The value to search for.
105
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
106
+ */
107
+ function arrayIncludes(array, value) {
108
+ var length = array == null ? 0 : array.length;
109
+ return !!length && baseIndexOf(array, value, 0) > -1;
110
+ }
111
+
112
+ /**
113
+ * This function is like `arrayIncludes` except that it accepts a comparator.
114
+ *
115
+ * @private
116
+ * @param {Array} [array] The array to inspect.
117
+ * @param {*} target The value to search for.
118
+ * @param {Function} comparator The comparator invoked per element.
119
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
120
+ */
121
+ function arrayIncludesWith(array, value, comparator) {
122
+ var index = -1,
123
+ length = array == null ? 0 : array.length;
124
+
125
+ while (++index < length) {
126
+ if (comparator(value, array[index])) {
127
+ return true;
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+
133
  /**
134
  * A specialized version of `_.map` for arrays without support for iteratee
135
  * shorthands.
150
  return result;
151
  }
152
 
153
+ /**
154
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
155
+ * support for iteratee shorthands.
156
+ *
157
+ * @private
158
+ * @param {Array} array The array to inspect.
159
+ * @param {Function} predicate The function invoked per iteration.
160
+ * @param {number} fromIndex The index to search from.
161
+ * @param {boolean} [fromRight] Specify iterating from right to left.
162
+ * @returns {number} Returns the index of the matched value, else `-1`.
163
+ */
164
+ function baseFindIndex(array, predicate, fromIndex, fromRight) {
165
+ var length = array.length,
166
+ index = fromIndex + (fromRight ? 1 : -1);
167
+
168
+ while ((fromRight ? index-- : ++index < length)) {
169
+ if (predicate(array[index], index, array)) {
170
+ return index;
171
+ }
172
+ }
173
+ return -1;
174
+ }
175
+
176
+ /**
177
+ * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
178
+ *
179
+ * @private
180
+ * @param {Array} array The array to inspect.
181
+ * @param {*} value The value to search for.
182
+ * @param {number} fromIndex The index to search from.
183
+ * @returns {number} Returns the index of the matched value, else `-1`.
184
+ */
185
+ function baseIndexOf(array, value, fromIndex) {
186
+ return value === value
187
+ ? strictIndexOf(array, value, fromIndex)
188
+ : baseFindIndex(array, baseIsNaN, fromIndex);
189
+ }
190
+
191
+ /**
192
+ * The base implementation of `_.isNaN` without support for number objects.
193
+ *
194
+ * @private
195
+ * @param {*} value The value to check.
196
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
197
+ */
198
+ function baseIsNaN(value) {
199
+ return value !== value;
200
+ }
201
+
202
+ /**
203
+ * The base implementation of `_.unary` without support for storing metadata.
204
+ *
205
+ * @private
206
+ * @param {Function} func The function to cap arguments for.
207
+ * @returns {Function} Returns the new capped function.
208
+ */
209
+ function baseUnary(func) {
210
+ return function(value) {
211
+ return func(value);
212
+ };
213
+ }
214
+
215
+ /**
216
+ * Checks if a `cache` value for `key` exists.
217
+ *
218
+ * @private
219
+ * @param {Object} cache The cache to query.
220
+ * @param {string} key The key of the entry to check.
221
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
222
+ */
223
+ function cacheHas(cache, key) {
224
+ return cache.has(key);
225
+ }
226
+
227
  /**
228
  * Gets the value at `key` of `object`.
229
  *
236
  return object == null ? undefined : object[key];
237
  }
238
 
239
+ /**
240
+ * A specialized version of `_.indexOf` which performs strict equality
241
+ * comparisons of values, i.e. `===`.
242
+ *
243
+ * @private
244
+ * @param {Array} array The array to inspect.
245
+ * @param {*} value The value to search for.
246
+ * @param {number} fromIndex The index to search from.
247
+ * @returns {number} Returns the index of the matched value, else `-1`.
248
+ */
249
+ function strictIndexOf(array, value, fromIndex) {
250
+ var index = fromIndex - 1,
251
+ length = array.length;
252
+
253
+ while (++index < length) {
254
+ if (array[index] === value) {
255
+ return index;
256
+ }
257
+ }
258
+ return -1;
259
+ }
260
+
261
  /*--------------------------------------------------------------------------*/
262
 
263
  /** Used for built-in method references. */
298
  splice = arrayProto.splice,
299
  symToStringTag = Symbol ? Symbol.toStringTag : undefined;
300
 
301
+ var defineProperty = (function() {
302
+ try {
303
+ var func = getNative(Object, 'defineProperty');
304
+ func({}, '', {});
305
+ return func;
306
+ } catch (e) {}
307
+ }());
308
+
309
+ /* Built-in method references for those with the same name as other `lodash` methods. */
310
+ var nativeMax = Math.max,
311
+ nativeMin = Math.min,
312
+ nativeNow = Date.now;
313
+
314
  /* Built-in method references that are verified to be native. */
315
  var Map = getNative(root, 'Map'),
316
  nativeCreate = getNative(Object, 'create');
771
 
772
  /*------------------------------------------------------------------------*/
773
 
774
+ /**
775
+ *
776
+ * Creates an array cache object to store unique values.
777
+ *
778
+ * @private
779
+ * @constructor
780
+ * @param {Array} [values] The values to cache.
781
+ */
782
+ function SetCache(values) {
783
+ var index = -1,
784
+ length = values == null ? 0 : values.length;
785
+
786
+ this.__data__ = new MapCache;
787
+ while (++index < length) {
788
+ this.add(values[index]);
789
+ }
790
+ }
791
+
792
+ /**
793
+ * Adds `value` to the array cache.
794
+ *
795
+ * @private
796
+ * @name add
797
+ * @memberOf SetCache
798
+ * @alias push
799
+ * @param {*} value The value to cache.
800
+ * @returns {Object} Returns the cache instance.
801
+ */
802
+ function setCacheAdd(value) {
803
+ this.__data__.set(value, HASH_UNDEFINED);
804
+ return this;
805
+ }
806
+
807
+ /**
808
+ * Checks if `value` is in the array cache.
809
+ *
810
+ * @private
811
+ * @name has
812
+ * @memberOf SetCache
813
+ * @param {*} value The value to search for.
814
+ * @returns {number} Returns `true` if `value` is found, else `false`.
815
+ */
816
+ function setCacheHas(value) {
817
+ return this.__data__.has(value);
818
+ }
819
+
820
+ // Add methods to `SetCache`.
821
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
822
+ SetCache.prototype.has = setCacheHas;
823
+
824
+ /*------------------------------------------------------------------------*/
825
+
826
  /**
827
  * Gets the index at which the `key` is found in `array` of key-value pairs.
828
  *
877
  : objectToString(value);
878
  }
879
 
880
+ /**
881
+ * The base implementation of methods like `_.intersection`, without support
882
+ * for iteratee shorthands, that accepts an array of arrays to inspect.
883
+ *
884
+ * @private
885
+ * @param {Array} arrays The arrays to inspect.
886
+ * @param {Function} [iteratee] The iteratee invoked per element.
887
+ * @param {Function} [comparator] The comparator invoked per element.
888
+ * @returns {Array} Returns the new array of shared values.
889
+ */
890
+ function baseIntersection(arrays, iteratee, comparator) {
891
+ var includes = comparator ? arrayIncludesWith : arrayIncludes,
892
+ length = arrays[0].length,
893
+ othLength = arrays.length,
894
+ othIndex = othLength,
895
+ caches = Array(othLength),
896
+ maxLength = Infinity,
897
+ result = [];
898
+
899
+ while (othIndex--) {
900
+ var array = arrays[othIndex];
901
+ if (othIndex && iteratee) {
902
+ array = arrayMap(array, baseUnary(iteratee));
903
+ }
904
+ maxLength = nativeMin(array.length, maxLength);
905
+ caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
906
+ ? new SetCache(othIndex && array)
907
+ : undefined;
908
+ }
909
+ array = arrays[0];
910
+
911
+ var index = -1,
912
+ seen = caches[0];
913
+
914
+ outer:
915
+ while (++index < length && result.length < maxLength) {
916
+ var value = array[index],
917
+ computed = iteratee ? iteratee(value) : value;
918
+
919
+ value = (comparator || value !== 0) ? value : 0;
920
+ if (!(seen
921
+ ? cacheHas(seen, computed)
922
+ : includes(result, computed, comparator)
923
+ )) {
924
+ othIndex = othLength;
925
+ while (--othIndex) {
926
+ var cache = caches[othIndex];
927
+ if (!(cache
928
+ ? cacheHas(cache, computed)
929
+ : includes(arrays[othIndex], computed, comparator))
930
+ ) {
931
+ continue outer;
932
+ }
933
+ }
934
+ if (seen) {
935
+ seen.push(computed);
936
+ }
937
+ result.push(value);
938
+ }
939
+ }
940
+ return result;
941
+ }
942
+
943
  /**
944
  * The base implementation of `_.isNative` without bad shim checks.
945
  *
956
  return pattern.test(toSource(value));
957
  }
958
 
959
+ /**
960
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
961
+ *
962
+ * @private
963
+ * @param {Function} func The function to apply a rest parameter to.
964
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
965
+ * @returns {Function} Returns the new function.
966
+ */
967
+ function baseRest(func, start) {
968
+ return setToString(overRest(func, start, identity), func + '');
969
+ }
970
+
971
+ /**
972
+ * The base implementation of `setToString` without support for hot loop shorting.
973
+ *
974
+ * @private
975
+ * @param {Function} func The function to modify.
976
+ * @param {Function} string The `toString` result.
977
+ * @returns {Function} Returns `func`.
978
+ */
979
+ var baseSetToString = !defineProperty ? identity : function(func, string) {
980
+ return defineProperty(func, 'toString', {
981
+ 'configurable': true,
982
+ 'enumerable': false,
983
+ 'value': constant(string),
984
+ 'writable': true
985
+ });
986
+ };
987
+
988
  /**
989
  * The base implementation of `_.toString` which doesn't convert nullish
990
  * values to empty strings.
1009
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
1010
  }
1011
 
1012
+ /**
1013
+ * Casts `value` to an empty array if it's not an array like object.
1014
+ *
1015
+ * @private
1016
+ * @param {*} value The value to inspect.
1017
+ * @returns {Array|Object} Returns the cast array-like object.
1018
+ */
1019
+ function castArrayLikeObject(value) {
1020
+ return isArrayLikeObject(value) ? value : [];
1021
+ }
1022
+
1023
  /**
1024
  * Casts `value` to a path array if it's not one.
1025
  *
1167
  return nativeObjectToString.call(value);
1168
  }
1169
 
1170
+ /**
1171
+ * A specialized version of `baseRest` which transforms the rest array.
1172
+ *
1173
+ * @private
1174
+ * @param {Function} func The function to apply a rest parameter to.
1175
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
1176
+ * @param {Function} transform The rest array transform.
1177
+ * @returns {Function} Returns the new function.
1178
+ */
1179
+ function overRest(func, start, transform) {
1180
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1181
+ return function() {
1182
+ var args = arguments,
1183
+ index = -1,
1184
+ length = nativeMax(args.length - start, 0),
1185
+ array = Array(length);
1186
+
1187
+ while (++index < length) {
1188
+ array[index] = args[start + index];
1189
+ }
1190
+ index = -1;
1191
+ var otherArgs = Array(start + 1);
1192
+ while (++index < start) {
1193
+ otherArgs[index] = args[index];
1194
+ }
1195
+ otherArgs[start] = transform(array);
1196
+ return apply(func, this, otherArgs);
1197
+ };
1198
+ }
1199
+
1200
+ /**
1201
+ * Sets the `toString` method of `func` to return `string`.
1202
+ *
1203
+ * @private
1204
+ * @param {Function} func The function to modify.
1205
+ * @param {Function} string The `toString` result.
1206
+ * @returns {Function} Returns `func`.
1207
+ */
1208
+ var setToString = shortOut(baseSetToString);
1209
+
1210
+ /**
1211
+ * Creates a function that'll short out and invoke `identity` instead
1212
+ * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
1213
+ * milliseconds.
1214
+ *
1215
+ * @private
1216
+ * @param {Function} func The function to restrict.
1217
+ * @returns {Function} Returns the new shortable function.
1218
+ */
1219
+ function shortOut(func) {
1220
+ var count = 0,
1221
+ lastCalled = 0;
1222
+
1223
+ return function() {
1224
+ var stamp = nativeNow(),
1225
+ remaining = HOT_SPAN - (stamp - lastCalled);
1226
+
1227
+ lastCalled = stamp;
1228
+ if (remaining > 0) {
1229
+ if (++count >= HOT_COUNT) {
1230
+ return arguments[0];
1231
+ }
1232
+ } else {
1233
+ count = 0;
1234
+ }
1235
+ return func.apply(undefined, arguments);
1236
+ };
1237
+ }
1238
+
1239
  /**
1240
  * Converts `string` to a property path array.
1241
  *
1290
 
1291
  /*------------------------------------------------------------------------*/
1292
 
1293
+ /**
1294
+ * Creates an array of unique values that are included in all given arrays
1295
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1296
+ * for equality comparisons. The order and references of result values are
1297
+ * determined by the first array.
1298
+ *
1299
+ * @static
1300
+ * @memberOf _
1301
+ * @since 0.1.0
1302
+ * @category Array
1303
+ * @param {...Array} [arrays] The arrays to inspect.
1304
+ * @returns {Array} Returns the new array of intersecting values.
1305
+ * @example
1306
+ *
1307
+ * _.intersection([2, 1], [2, 3]);
1308
+ * // => [2]
1309
+ */
1310
+ var intersection = baseRest(function(arrays) {
1311
+ var mapped = arrayMap(arrays, castArrayLikeObject);
1312
+ return (mapped.length && mapped[0] === arrays[0])
1313
+ ? baseIntersection(mapped)
1314
+ : [];
1315
+ });
1316
+
1317
+ /*------------------------------------------------------------------------*/
1318
+
1319
  /**
1320
  * Creates a function that memoizes the result of `func`. If `resolver` is
1321
  * provided, it determines the cache key for storing the result based on the
1446
  */
1447
  var isArray = Array.isArray;
1448
 
1449
+ /**
1450
+ * Checks if `value` is array-like. A value is considered array-like if it's
1451
+ * not a function and has a `value.length` that's an integer greater than or
1452
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
1453
+ *
1454
+ * @static
1455
+ * @memberOf _
1456
+ * @since 4.0.0
1457
+ * @category Lang
1458
+ * @param {*} value The value to check.
1459
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
1460
+ * @example
1461
+ *
1462
+ * _.isArrayLike([1, 2, 3]);
1463
+ * // => true
1464
+ *
1465
+ * _.isArrayLike(document.body.children);
1466
+ * // => true
1467
+ *
1468
+ * _.isArrayLike('abc');
1469
+ * // => true
1470
+ *
1471
+ * _.isArrayLike(_.noop);
1472
+ * // => false
1473
+ */
1474
+ function isArrayLike(value) {
1475
+ return value != null && isLength(value.length) && !isFunction(value);
1476
+ }
1477
+
1478
+ /**
1479
+ * This method is like `_.isArrayLike` except that it also checks if `value`
1480
+ * is an object.
1481
+ *
1482
+ * @static
1483
+ * @memberOf _
1484
+ * @since 4.0.0
1485
+ * @category Lang
1486
+ * @param {*} value The value to check.
1487
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
1488
+ * else `false`.
1489
+ * @example
1490
+ *
1491
+ * _.isArrayLikeObject([1, 2, 3]);
1492
+ * // => true
1493
+ *
1494
+ * _.isArrayLikeObject(document.body.children);
1495
+ * // => true
1496
+ *
1497
+ * _.isArrayLikeObject('abc');
1498
+ * // => false
1499
+ *
1500
+ * _.isArrayLikeObject(_.noop);
1501
+ * // => false
1502
+ */
1503
+ function isArrayLikeObject(value) {
1504
+ return isObjectLike(value) && isArrayLike(value);
1505
+ }
1506
+
1507
  /**
1508
  * Checks if `value` is classified as a `Function` object.
1509
  *
1531
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
1532
  }
1533
 
1534
+ /**
1535
+ * Checks if `value` is a valid array-like length.
1536
+ *
1537
+ * **Note:** This method is loosely based on
1538
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
1539
+ *
1540
+ * @static
1541
+ * @memberOf _
1542
+ * @since 4.0.0
1543
+ * @category Lang
1544
+ * @param {*} value The value to check.
1545
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
1546
+ * @example
1547
+ *
1548
+ * _.isLength(3);
1549
+ * // => true
1550
+ *
1551
+ * _.isLength(Number.MIN_VALUE);
1552
+ * // => false
1553
+ *
1554
+ * _.isLength(Infinity);
1555
+ * // => false
1556
+ *
1557
+ * _.isLength('3');
1558
+ * // => false
1559
+ */
1560
+ function isLength(value) {
1561
+ return typeof value == 'number' &&
1562
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
1563
+ }
1564
+
1565
  /**
1566
  * Checks if `value` is the
1567
  * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
1701
 
1702
  /*------------------------------------------------------------------------*/
1703
 
1704
+ /**
1705
+ * Creates a function that returns `value`.
1706
+ *
1707
+ * @static
1708
+ * @memberOf _
1709
+ * @since 2.4.0
1710
+ * @category Util
1711
+ * @param {*} value The value to return from the new function.
1712
+ * @returns {Function} Returns the new constant function.
1713
+ * @example
1714
+ *
1715
+ * var objects = _.times(2, _.constant({ 'a': 1 }));
1716
+ *
1717
+ * console.log(objects);
1718
+ * // => [{ 'a': 1 }, { 'a': 1 }]
1719
+ *
1720
+ * console.log(objects[0] === objects[1]);
1721
+ * // => true
1722
+ */
1723
+ function constant(value) {
1724
+ return function() {
1725
+ return value;
1726
+ };
1727
+ }
1728
+
1729
+ /**
1730
+ * This method returns the first argument it receives.
1731
+ *
1732
+ * @static
1733
+ * @since 0.1.0
1734
+ * @memberOf _
1735
+ * @category Util
1736
+ * @param {*} value Any value.
1737
+ * @returns {*} Returns `value`.
1738
+ * @example
1739
+ *
1740
+ * var object = { 'a': 1 };
1741
+ *
1742
+ * console.log(_.identity(object) === object);
1743
+ * // => true
1744
+ */
1745
+ function identity(value) {
1746
+ return value;
1747
+ }
1748
+
1749
+ /*------------------------------------------------------------------------*/
1750
+
1751
  // Add methods that return wrapped values in chain sequences.
1752
+ lodash.constant = constant;
1753
+ lodash.intersection = intersection;
1754
  lodash.memoize = memoize;
1755
 
1756
  /*------------------------------------------------------------------------*/
1758
  // Add methods that return unwrapped values in chain sequences.
1759
  lodash.eq = eq;
1760
  lodash.get = get;
1761
+ lodash.identity = identity;
1762
  lodash.isArray = isArray;
1763
+ lodash.isArrayLike = isArrayLike;
1764
+ lodash.isArrayLikeObject = isArrayLikeObject;
1765
  lodash.isFunction = isFunction;
1766
+ lodash.isLength = isLength;
1767
  lodash.isObject = isObject;
1768
  lodash.isObjectLike = isObjectLike;
1769
  lodash.isSymbol = isSymbol;
js/lodash.custom.min.js CHANGED
@@ -1,14 +1,18 @@
1
  /**
2
  * @license
3
  * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
4
- * Build: `lodash include="get" -o js/lodash.custom.js`
5
  */
6
- ;(function(){function t(){}function e(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function n(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function r(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function o(t,e){for(var n=t.length;n--;)if(f(t[n][0],e))return n;return-1}function i(t){if(null==t)t=t===b?"[object Undefined]":"[object Null]";else if(I&&I in Object(t)){var e=T.call(t,I),n=t[I];
7
- try{t[I]=b;var r=true}catch(t){}var o=P.call(t);r&&(e?t[I]=n:delete t[I]),t=o}else t=P.call(t);return t}function a(t){if(typeof t=="string")return t;if(M(t)){for(var e=-1,n=null==t?0:t.length,r=Array(n);++e<n;)r[e]=a(t[e]);return r+""}return y(t)?G?G.call(t):"":(e=t+"","0"==e&&1/t==-g?"-0":e)}function c(t,e){var n=t.__data__,r=typeof e;return("string"==r||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==e:null===e)?n[typeof e=="string"?"string":"hash"]:n.map}function u(t,e){var n=null==t?b:t[e];
8
- return(!h(n)||C&&C in n?0:(p(n)?k:z).test(s(n)))?n:b}function s(t){if(null!=t){try{return E.call(t)}catch(t){}return t+""}return""}function l(t,e){function n(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;return i.has(o)?i.get(o):(r=t.apply(this,r),n.cache=i.set(o,r)||i,r)}if(typeof t!="function"||null!=e&&typeof e!="function")throw new TypeError("Expected a function");return n.cache=new(l.Cache||r),n}function f(t,e){return t===e||t!==t&&e!==e}function p(t){return!!h(t)&&(t=i(t),"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t);
9
- }function h(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function _(t){return null!=t&&typeof t=="object"}function y(t){return typeof t=="symbol"||_(t)&&"[object Symbol]"==i(t)}function d(t){return null==t?"":a(t)}var b,g=1/0,v=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,j=/^\w*$/,m=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,O=/\\(\\)?/g,z=/^\[object .+?Constructor\]$/,S=typeof self=="object"&&self&&self.Object===Object&&self,S=typeof global=="object"&&global&&global.Object===Object&&global||S||Function("return this")(),w=typeof exports=="object"&&exports&&!exports.nodeType&&exports,x=w&&typeof module=="object"&&module&&!module.nodeType&&module,$=Array.prototype,A=Object.prototype,F=S["__core-js_shared__"],E=Function.prototype.toString,T=A.hasOwnProperty,C=function(){
10
- var t=/[^.]+$/.exec(F&&F.keys&&F.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),P=A.toString,k=RegExp("^"+E.call(T).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),A=S.Symbol,R=$.splice,I=A?A.toStringTag:b,N=u(S,"Map"),q=u(Object,"create"),G=($=A?A.prototype:b)?$.toString:b;e.prototype.clear=function(){this.__data__=q?q(null):{},this.size=0},e.prototype.delete=function(t){return t=this.has(t)&&delete this.__data__[t],this.size-=t?1:0,
11
- t},e.prototype.get=function(t){var e=this.__data__;return q?(t=e[t],"__lodash_hash_undefined__"===t?b:t):T.call(e,t)?e[t]:b},e.prototype.has=function(t){var e=this.__data__;return q?e[t]!==b:T.call(e,t)},e.prototype.set=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=q&&e===b?"__lodash_hash_undefined__":e,this},n.prototype.clear=function(){this.__data__=[],this.size=0},n.prototype.delete=function(t){var e=this.__data__;return t=o(e,t),!(0>t)&&(t==e.length-1?e.pop():R.call(e,t,1),
12
- --this.size,true)},n.prototype.get=function(t){var e=this.__data__;return t=o(e,t),0>t?b:e[t][1]},n.prototype.has=function(t){return-1<o(this.__data__,t)},n.prototype.set=function(t,e){var n=this.__data__,r=o(n,t);return 0>r?(++this.size,n.push([t,e])):n[r][1]=e,this},r.prototype.clear=function(){this.size=0,this.__data__={hash:new e,map:new(N||n),string:new e}},r.prototype.delete=function(t){return t=c(this,t).delete(t),this.size-=t?1:0,t},r.prototype.get=function(t){return c(this,t).get(t)},r.prototype.has=function(t){
13
- return c(this,t).has(t)},r.prototype.set=function(t,e){var n=c(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this};var L=function(t){t=l(t,function(t){return 500===e.size&&e.clear(),t});var e=t.cache;return t}(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(m,function(t,n,r,o){e.push(r?o.replace(O,"$1"):n||t)}),e});l.Cache=r;var M=Array.isArray;t.memoize=l,t.eq=f,t.get=function(t,e,n){if(null==t)t=b;else{var r=t;if(!M(e)){if(M(e))r=false;else var o=typeof e,r=!("number"!=o&&"symbol"!=o&&"boolean"!=o&&null!=e&&!y(e))||(j.test(e)||!v.test(e)||null!=r&&e in Object(r));
14
- e=r?[e]:L(d(e))}for(r=0,o=e.length;null!=t&&r<o;){var i;if(i=e[r++],typeof i!="string"&&!y(i)){var a=i+"";i="0"==a&&1/i==-g?"-0":a}t=t[i]}t=r&&r==o?t:b}return t===b?n:t},t.isArray=M,t.isFunction=p,t.isObject=h,t.isObjectLike=_,t.isSymbol=y,t.toString=d,t.VERSION="4.17.5",typeof define=="function"&&typeof define.amd=="object"&&define.amd?(S._=t, define(function(){return t})):x?((x.exports=t)._=t,w._=t):S._=t}).call(this);
 
 
 
 
1
  /**
2
  * @license
3
  * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
4
+ * Build: `lodash include="get,intersection" -o js/lodash.custom.js`
5
  */
6
+ ;(function(){function t(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function e(t,e){var n;if(n=!(null==t||!t.length)){if(e===e)t:{n=-1;for(var o=t.length;++n<o;)if(t[n]===e)break t;n=-1}else t:{n=r;for(var o=t.length,i=-1;++i<o;)if(n(t[i],i,t)){n=i;break t}n=-1}n=-1<n}return n}function n(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n<r;)o[n]=e(t[n],n,t);return o}function r(t){
7
+ return t!==t}function o(){}function i(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function a(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function c(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new a;++e<n;)this.add(t[e])}function l(t,e){for(var n=t.length;n--;)if(b(t[n][0],e))return n;return-1}function s(t){
8
+ if(null==t)t=t===k?"[object Undefined]":"[object Null]";else if(K&&K in Object(t)){var e=U.call(t,K),n=t[K];try{t[K]=k;var r=true}catch(t){}var o=B.call(t);r&&(e?t[K]=n:delete t[K]),t=o}else t=B.call(t);return t}function f(t){if(typeof t=="string")return t;if(ot(t))return n(t,f)+"";if(A(t))return et?et.call(t):"";var e=t+"";return"0"==e&&1/t==-F?"-0":e}function h(t){return j(t)?t:[]}function p(t,e){var n=t.__data__,r=typeof e;return("string"==r||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==e:null===e)?n[typeof e=="string"?"string":"hash"]:n.map;
9
+ }function _(t,e){var n=null==t?k:t[e];return(!w(n)||V&&V in n?0:(m(n)?H:L).test(d(n)))?n:k}function y(e,n,r){return n=W(n===k?e.length-1:n,0),function(){for(var o=arguments,i=-1,u=W(o.length-n,0),a=Array(u);++i<u;)a[i]=o[n+i];for(i=-1,u=Array(n+1);++i<n;)u[i]=o[i];return u[n]=r(a),t(e,this,u)}}function d(t){if(null!=t){try{return G.call(t)}catch(t){}return t+""}return""}function g(t,e){function n(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;return i.has(o)?i.get(o):(r=t.apply(this,r),n.cache=i.set(o,r)||i,
10
+ r)}if(typeof t!="function"||null!=e&&typeof e!="function")throw new TypeError("Expected a function");return n.cache=new(g.Cache||a),n}function b(t,e){return t===e||t!==t&&e!==e}function v(t){return null!=t&&O(t.length)&&!m(t)}function j(t){return z(t)&&v(t)}function m(t){return!!w(t)&&(t=s(t),"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t)}function O(t){return typeof t=="number"&&-1<t&&0==t%1&&9007199254740991>=t}function w(t){var e=typeof t;
11
+ return null!=t&&("object"==e||"function"==e)}function z(t){return null!=t&&typeof t=="object"}function A(t){return typeof t=="symbol"||z(t)&&"[object Symbol]"==s(t)}function S(t){return null==t?"":f(t)}function x(t){return function(){return t}}function $(t){return t}var k,F=1/0,E=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,P=/^\w*$/,T=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,C=/\\(\\)?/g,L=/^\[object .+?Constructor\]$/,M=typeof self=="object"&&self&&self.Object===Object&&self,M=typeof global=="object"&&global&&global.Object===Object&&global||M||Function("return this")(),R=typeof exports=="object"&&exports&&!exports.nodeType&&exports,I=R&&typeof module=="object"&&module&&!module.nodeType&&module,N=Array.prototype,q=Object.prototype,D=M["__core-js_shared__"],G=Function.prototype.toString,U=q.hasOwnProperty,V=function(){
12
+ var t=/[^.]+$/.exec(D&&D.keys&&D.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),B=q.toString,H=RegExp("^"+G.call(U).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),q=M.Symbol,J=N.splice,K=q?q.toStringTag:k,Q=function(){try{var t=_(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),W=Math.max,X=Math.min,Y=Date.now,Z=_(M,"Map"),tt=_(Object,"create"),et=(N=q?q.prototype:k)?N.toString:k;i.prototype.clear=function(){this.__data__=tt?tt(null):{},
13
+ this.size=0},i.prototype.delete=function(t){return t=this.has(t)&&delete this.__data__[t],this.size-=t?1:0,t},i.prototype.get=function(t){var e=this.__data__;return tt?(t=e[t],"__lodash_hash_undefined__"===t?k:t):U.call(e,t)?e[t]:k},i.prototype.has=function(t){var e=this.__data__;return tt?e[t]!==k:U.call(e,t)},i.prototype.set=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=tt&&e===k?"__lodash_hash_undefined__":e,this},u.prototype.clear=function(){this.__data__=[],this.size=0;
14
+ },u.prototype.delete=function(t){var e=this.__data__;return t=l(e,t),!(0>t)&&(t==e.length-1?e.pop():J.call(e,t,1),--this.size,true)},u.prototype.get=function(t){var e=this.__data__;return t=l(e,t),0>t?k:e[t][1]},u.prototype.has=function(t){return-1<l(this.__data__,t)},u.prototype.set=function(t,e){var n=this.__data__,r=l(n,t);return 0>r?(++this.size,n.push([t,e])):n[r][1]=e,this},a.prototype.clear=function(){this.size=0,this.__data__={hash:new i,map:new(Z||u),string:new i}},a.prototype.delete=function(t){
15
+ return t=p(this,t).delete(t),this.size-=t?1:0,t},a.prototype.get=function(t){return p(this,t).get(t)},a.prototype.has=function(t){return p(this,t).has(t)},a.prototype.set=function(t,e){var n=p(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},c.prototype.add=c.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},c.prototype.has=function(t){return this.__data__.has(t)};var nt=function(t){var e=0,n=0;return function(){var r=Y(),o=16-(r-n);if(n=r,0<o){
16
+ if(800<=++e)return arguments[0]}else e=0;return t.apply(k,arguments)}}(Q?function(t,e){return Q(t,"toString",{configurable:true,enumerable:false,value:x(e),writable:true})}:$),rt=function(t){t=g(t,function(t){return 500===e.size&&e.clear(),t});var e=t.cache;return t}(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(T,function(t,n,r,o){e.push(r?o.replace(C,"$1"):n||t)}),e}),N=function(t,e){return nt(y(t,e,$),t+"")}(function(t){var r=n(t,h);if(r.length&&r[0]===t[0]){t=r[0].length;for(var o=r.length,i=o,u=Array(o),a=1/0,l=[];i--;){
17
+ var s=r[i],a=X(s.length,a);u[i]=120<=t&&120<=s.length?new c(i&&s):k}var s=r[0],f=-1,p=u[0];t:for(;++f<t&&l.length<a;){var _=s[f],y=_,_=0!==_?_:0;if(p?!p.has(y):!e(l,y)){for(i=o;--i;){var d=u[i];if(d?!d.has(y):!e(r[i],y))continue t}p&&p.push(y),l.push(_)}}r=l}else r=[];return r});g.Cache=a;var ot=Array.isArray;o.constant=x,o.intersection=N,o.memoize=g,o.eq=b,o.get=function(t,e,n){if(null==t)t=k;else{var r=t;if(!ot(e)){if(ot(e))r=false;else var o=typeof e,r=!("number"!=o&&"symbol"!=o&&"boolean"!=o&&null!=e&&!A(e))||(P.test(e)||!E.test(e)||null!=r&&e in Object(r));
18
+ e=r?[e]:rt(S(e))}for(r=0,o=e.length;null!=t&&r<o;){var i;if(i=e[r++],typeof i!="string"&&!A(i)){var u=i+"";i="0"==u&&1/i==-F?"-0":u}t=t[i]}t=r&&r==o?t:k}return t===k?n:t},o.identity=$,o.isArray=ot,o.isArrayLike=v,o.isArrayLikeObject=j,o.isFunction=m,o.isLength=O,o.isObject=w,o.isObjectLike=z,o.isSymbol=A,o.toString=S,o.VERSION="4.17.5",typeof define=="function"&&typeof define.amd=="object"&&define.amd?(M._=o, define(function(){return o})):I?((I.exports=o)._=o,R._=o):M._=o}).call(this);
js/lookup.js ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Record from './models/record';
2
+ import { getLocalStorage, setLocalStorage } from './lib/localStorageAccess';
3
+ import _ from './lodash.custom';
4
+ import { makeJSONRequest } from './lib/xhr';
5
+
6
+
7
+ export const options = window.geoip_detect?.options || {
8
+ ajaxurl: "/wp-admin/admin-ajax.php",
9
+ default_locales: ['en'],
10
+ cookie_duration_in_days: 7,
11
+ cookie_name: 'geoip-detect-result'
12
+ };
13
+
14
+ let ajaxPromise = null;
15
+
16
+ function get_info_raw() {
17
+ if (!ajaxPromise) {
18
+ // Do Ajax Request only once per page load
19
+ const url = options.ajaxurl + '?action=geoip_detect2_get_info_from_current_ip'
20
+
21
+ ajaxPromise = makeJSONRequest(url);
22
+ }
23
+
24
+ return ajaxPromise;
25
+ }
26
+
27
+ async function get_info_cached() {
28
+ let response = false;
29
+ let storedResponse = false;
30
+
31
+ // 1) Load Info from localstorage cookie cache, if possible
32
+ if (options.cookie_name) {
33
+ storedResponse = getLocalStorage(options.cookie_name)
34
+ if (storedResponse && storedResponse.extra) {
35
+ return storedResponse;
36
+ }
37
+ }
38
+
39
+ // 2) Get response
40
+ try {
41
+ response = await get_info_raw();
42
+ } catch (err) {
43
+ response = err.responseJSON || err;
44
+ }
45
+
46
+ // 3) Save info to localstorage cookie cache
47
+ if (options.cookie_name) {
48
+ storedResponse = getLocalStorage(options.cookie_name)
49
+ if (storedResponse?.extra?.override === true) {
50
+ return storedResponse;
51
+ }
52
+
53
+ // This might be an error object - cache it anyway
54
+ setLocalStorage(options.cookie_name, response, options.cookie_duration_in_days * 24 * 60 * 60);
55
+ }
56
+
57
+ return response;
58
+ }
59
+
60
+
61
+ /**
62
+ * This functions allows to override the geodetected data manually (e.g. a country selector)
63
+ *
64
+ * @api
65
+ * @param {*} record
66
+ * @param {number} duration_in_days When this override expires (default: 1 week later)
67
+ * @return boolean
68
+ */
69
+ export function set_override(record, duration_in_days) {
70
+ if (record && typeof(record.serialize) === 'function') {
71
+ record = record.serialize();
72
+ }
73
+
74
+ duration_in_days = duration_in_days || options.cookie_duration_in_days;
75
+ if (duration_in_days < 0) {
76
+ console.warn('set_override_data() did nothing: A negative duration doesn\'t make sense. If you want to remove the override, use remove_override() instead.');
77
+ return false;
78
+ }
79
+
80
+ return set_override_data(record, duration_in_days);
81
+ }
82
+ function set_override_data(data, duration_in_days) {
83
+ if (!data) {
84
+ data = {};
85
+ }
86
+ if (!data.extra) {
87
+ data.extra = {};
88
+ }
89
+ data.extra.override = true;
90
+
91
+ setLocalStorage(options.cookie_name, data, duration_in_days * 24 * 60 * 60);
92
+ return true;
93
+ }
94
+
95
+ /**
96
+ * Remove the override data.
97
+ * On next page load, the record data will be loaded from the server again.
98
+ *
99
+ * @return boolean
100
+ */
101
+ export function remove_override() {
102
+ setLocalStorage(options.cookie_name, {}, -1);
103
+ return true;
104
+ }
105
+
106
+
107
+ /**
108
+ * Load the data from the server
109
+ *
110
+ * (It can also be loaded from the browser localstorage, if the record data is present there already.)
111
+ *
112
+ * @api
113
+ * @return Promise(Record)
114
+ */
115
+ export async function get_info() {
116
+ let response = await get_info_cached();
117
+
118
+ if (typeof (response) !== 'object') {
119
+ console.error('Geoip-detect: Record should be an object, not a ' + typeof (response), response);
120
+ response = { 'extra': { 'error': response || 'Network error, look at the original server response ...' } };
121
+ }
122
+
123
+ const record = new Record(response, options.default_locales);
124
+ return record;
125
+ }
js/lookup.test.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { set_override, get_info } from "./lookup";
2
+ import { getTestRecord } from "./test-lib/test-records";
3
+ import Record from "./models/record";
4
+
5
+ const defaultRecord = getTestRecord();
6
+ const emptyRecord = new Record();
7
+
8
+
9
+ test('override', async () => {
10
+ let record;
11
+
12
+ set_override(defaultRecord);
13
+ record = await get_info();
14
+
15
+ expect(record.get_country_iso()).toBe('de');
16
+
17
+ set_override(emptyRecord);
18
+ record = await get_info();
19
+
20
+ expect(record.get_country_iso()).toBe('');
21
+
22
+ set_override({country:{iso_code: 'fr'}});
23
+ record = await get_info();
24
+
25
+ expect(record.get_country_iso()).toBe('fr');
26
+
27
+ set_override({ });
28
+ record = await get_info();
29
+
30
+ expect(record.get_country_iso()).toBe('');
31
+ })
32
+
33
+ test('override data', async () => {
34
+ let record;
35
+
36
+ set_override({ country: { iso_code: 'fr' } });
37
+ record = await get_info();
38
+ expect(record.get_country_iso()).toBe('fr');
39
+
40
+ set_override({});
41
+ record = await get_info();
42
+ expect(record.get_country_iso()).toBe('');
43
+
44
+ set_override({ country: { iso_code: 'ru' } });
45
+ record = await get_info();
46
+ expect(record.get_country_iso()).toBe('ru');
47
+
48
+ set_override();
49
+ record = await get_info();
50
+ expect(record.get_country_iso()).toBe('');
51
+ });
52
+
53
+ test('warning if negative duration', () => {
54
+ const spy = jest.spyOn(console, 'warn').mockImplementation(() => { })
55
+
56
+ const ret = set_override({ country: { iso_code: 'fr' } }, -4);
57
+ expect(ret).toBe(false);
58
+
59
+ expect(spy).toHaveBeenCalled();
60
+ spy.mockRestore();
61
+ });
js/models/record.js CHANGED
@@ -3,23 +3,36 @@ import _ from '../lodash.custom';
3
 
4
 
5
  const _get_localized = function(ret, locales) {
6
- if (typeof(ret) == 'object' && typeof(ret.names) == 'object') {
7
- if (typeof(locales) == 'string') {
 
8
  locales = [ locales ];
9
  }
 
 
 
 
 
 
 
10
 
11
- for (let locale of locales) {
12
- if (ret.names[locale]) {
13
- return ret.names[locale];
14
  }
15
  }
16
-
17
- return '';
 
 
18
  }
19
  return ret;
20
  }
21
 
22
-
 
 
 
23
 
24
  class Record {
25
  data = {};
@@ -31,26 +44,61 @@ class Record {
31
  }
32
 
33
  get(prop, default_value) {
34
- return this.get_with_locales(prop, this.default_locales, default_value);
 
 
 
 
 
35
  }
36
 
 
 
 
 
 
 
 
37
 
38
- get_with_locales(prop, locales, default_value) {
39
  // Treat pseudo-property 'name' as if it never existed
40
  if (prop.substr(-5) === '.name') {
41
  prop = prop.substr(0, prop.length - 5);
42
  }
43
-
44
- // TODO handle most_specific_subdivision (here or in PHP)?
45
-
46
  let ret = _.get(this.data, prop, default_value);
47
-
48
  // Localize property, if possible
49
  ret = _get_localized(ret, locales);
50
 
51
  return ret;
52
  }
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  /**
55
  * Get error message, if any
56
  * @return string Error Message
@@ -58,6 +106,10 @@ class Record {
58
  error() {
59
  return _.get(this.data, 'extra.error', '');
60
  }
 
 
 
 
61
  }
62
 
63
  export default Record;
3
 
4
 
5
  const _get_localized = function(ret, locales) {
6
+ if (typeof(ret) === 'object') {
7
+
8
+ if (typeof(locales) === 'string') {
9
  locales = [ locales ];
10
  }
11
+ if (typeof(locales) !== 'object') {
12
+ locales = [];
13
+ }
14
+
15
+ if (typeof(ret.names) === 'object') {
16
+ for (let i = 0 ; i < locales.length ; i++) {
17
+ let locale = locales[i];
18
 
19
+ if (ret.names[locale]) {
20
+ return ret.names[locale];
21
+ }
22
  }
23
  }
24
+
25
+ if (ret.name) {
26
+ return ret.name;
27
+ }
28
  }
29
  return ret;
30
  }
31
 
32
+ export const camelToUnderscore = function(key) {
33
+ // Tolerate PascalCase. But _key stays _key [ (?<=[a-z0-9]) means Look-ahead]
34
+ return key.replace(/(?<=[a-z0-9])([A-Z])/g, "_$1").toLowerCase();
35
+ }
36
 
37
  class Record {
38
  data = {};
44
  }
45
 
46
  get(prop, default_value) {
47
+ return this.get_with_locales(prop, null, default_value);
48
+ }
49
+
50
+ get_raw(prop) {
51
+ prop = camelToUnderscore(prop);
52
+ return _.get(this.data, prop, null);
53
  }
54
 
55
+ has_property(prop) {
56
+ const ret = this._lookup_with_locales(prop, this.default_locales)
57
+ return typeof(ret) !== 'undefined';
58
+ }
59
+
60
+ _lookup_with_locales(prop, locales, default_value = '') {
61
+ prop = camelToUnderscore(prop);
62
 
 
63
  // Treat pseudo-property 'name' as if it never existed
64
  if (prop.substr(-5) === '.name') {
65
  prop = prop.substr(0, prop.length - 5);
66
  }
67
+
 
 
68
  let ret = _.get(this.data, prop, default_value);
69
+
70
  // Localize property, if possible
71
  ret = _get_localized(ret, locales);
72
 
73
  return ret;
74
  }
75
 
76
+ get_with_locales(prop, locales, default_value) {
77
+ if (!Array.isArray(locales) || locales.length === 0) {
78
+ locales = this.default_locales;
79
+ }
80
+
81
+ const ret = this._lookup_with_locales(prop, locales, default_value);
82
+
83
+ if (typeof(ret) === 'object') {
84
+ console.warn('Geolocation IP Detection: The property "' + prop + '" is of type "' + typeof (ret) + '", should be string or similar', ret)
85
+ }
86
+ if (typeof(ret) === 'undefined') {
87
+ console.warn('Geolocation IP Detection: The property "' + prop + '" is not defined, please check spelling or maybe you need a different data source', { data: this.data })
88
+ return '';
89
+ }
90
+
91
+ return ret;
92
+ }
93
+
94
+ get_country_iso() {
95
+ let country = this.get('country.iso_code');
96
+ if(country) {
97
+ country = country.substr(0, 2).toLowerCase();
98
+ }
99
+ return country;
100
+ }
101
+
102
  /**
103
  * Get error message, if any
104
  * @return string Error Message
106
  error() {
107
  return _.get(this.data, 'extra.error', '');
108
  }
109
+
110
+ serialize() {
111
+ return this.data;
112
+ }
113
  }
114
 
115
  export default Record;
js/models/record.test.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { getTestRecord, getTestRecordError } from "../test-lib/test-records";
2
+ import Record from "./record";
3
+
4
+
5
+ const emptyRecord = new Record();
6
+ const defaultRecord = getTestRecord();
7
+ const errorRecord = getTestRecordError();
8
+
9
+ test('get error message', () => {
10
+ expect(emptyRecord.error()).toBe('');
11
+ expect(defaultRecord.error()).toBe('');
12
+ expect(errorRecord.error()).not.toBe('');
13
+ })
14
+
15
+ test('localisation variants', () => {
16
+ expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
17
+ expect(defaultRecord.get_with_locales('country', ['de', 'en'])).toBe('Deutschland');
18
+ expect(defaultRecord.get_with_locales('country.names.de', ['de', 'en'])).toBe('Deutschland');
19
+ expect(defaultRecord.get_with_locales('country.names.en', ['de', 'en'])).toBe('Germany');
20
+
21
+ expect(defaultRecord.get_with_locales('most_specific_subdivision', ['de', 'en'])).toBe('Hessen');
22
+ expect(defaultRecord.get_with_locales('mostSpecificSubdivision', ['de', 'en'])).toBe('Hessen');
23
+ });
24
+
25
+ test('localisation', () => {
26
+ expect(defaultRecord.get_with_locales('country.name', ['de', 'en'])).toBe('Deutschland');
27
+ expect(defaultRecord.get_with_locales('country.name', ['en', 'de'])).toBe('Germany');
28
+ expect(defaultRecord.get_with_locales('country.name', ['nn', 'mm', 'de', 'en'])).toBe('Deutschland');
29
+ });
30
+
31
+ test('country iso', () => {
32
+ expect(defaultRecord.get_country_iso()).toBe('de');
33
+ expect(emptyRecord.get_country_iso()).toBe('');
34
+ expect(errorRecord.get_country_iso()).toBe('');
35
+ });
js/shortcodes/helpers.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { get_info } from "../lookup";
2
+
3
+ // Get Options from data-options and json parse them
4
+ export function get_options(el) {
5
+ const raw = el.getAttribute('data-options');
6
+ try {
7
+ return JSON.parse(raw);
8
+ } catch (e) {
9
+ return {};
10
+ }
11
+ }
12
+
13
+ export async function action_on_elements(className, errorMessage, callback) {
14
+ const elements = document.getElementsByClassName(className);
15
+ if (!elements.length) return;
16
+
17
+ const record = await get_info();
18
+
19
+ if (record.error()) {
20
+ console.error('Geolocation IP Detection Error (' + errorMessage + '): ' + record.error());
21
+ return;
22
+ }
23
+
24
+ Array.from(elements)
25
+ .forEach(el => callback(el, record));
26
+ }
27
+
28
+ export function get_value_from_record(el, record, property = null) {
29
+ const opt = get_options(el);
30
+ property = property || opt.property;
31
+ if (opt.skip_cache) {
32
+ console.warn("Geolocation IP Detection: The property 'skip_cache' is ignored in AJAX mode. You could disable the response caching on the server by setting the constant GEOIP_DETECT_READER_CACHE_TIME.");
33
+ }
34
+
35
+ return record.get_with_locales(property, opt.lang, opt.default);
36
+ }
js/shortcodes/index.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { domReady } from "../lib/html";
2
+ import { action_on_elements } from "./helpers";
3
+ import { do_shortcode_country_select, do_shortcode_flags, do_shortcode_normal, do_shortcode_text_input } from "./normal";
4
+ import { do_shortcode_show_if } from "./show-if";
5
+
6
+
7
+ export const do_shortcodes = async function do_shortcodes() {
8
+ await domReady;
9
+
10
+ // These are called in parallel, as they are async functions
11
+ action_on_elements('js-geoip-detect-shortcode',
12
+ 'could not execute shortcode(s) [geoip_detect2]', do_shortcode_normal);
13
+
14
+ action_on_elements('js-geoip-detect-flag',
15
+ 'could not configure the flag(s)', do_shortcode_flags);
16
+
17
+ action_on_elements('js-geoip-text-input',
18
+ 'could not set the value of the text input field(s)', do_shortcode_text_input);
19
+
20
+ action_on_elements('js-geoip-detect-country-select',
21
+ 'could not set the value of the select field(s)', do_shortcode_country_select);
22
+
23
+ action_on_elements('js-geoip-detect-show-if',
24
+ 'could not execute the show-if/hide-if conditions', do_shortcode_show_if);
25
+
26
+ };
js/shortcodes/normal.js ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { selectItemByAttribute, triggerNativeEvent } from "../lib/html";
2
+ import { get_value_from_record, get_options } from "./helpers";
3
+
4
+ export function do_shortcode_normal(el, record) {
5
+ el.innerText = get_value_from_record(el, record);
6
+ }
7
+
8
+ export function do_shortcode_flags(el, record) {
9
+ const country = record.get_country_iso() || get_options(el).default;
10
+ if (country) {
11
+ el.classList.add('flag-icon-' + country)
12
+ }
13
+ }
14
+
15
+ export function do_shortcode_country_select(el, record) {
16
+ let country = record.get_country_iso();
17
+
18
+ selectItemByAttribute(el, 'data-c', country);
19
+ triggerNativeEvent(el, 'change');
20
+ }
21
+
22
+ export function do_shortcode_text_input(el, record) {
23
+ el.value = get_value_from_record(el, record);
24
+ triggerNativeEvent(el, 'change');
25
+ }
js/shortcodes/show-if.js ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { get_options } from './helpers';
2
+ import _ from '../lodash.custom'; // we might use lodash-es in the future
3
+
4
+
5
+ export function do_shortcode_show_if(el, record) {
6
+ const opt = get_options(el);
7
+ const evaluated = geoip_detect2_shortcode_evaluate_conditions(opt.parsed, opt, record);
8
+
9
+ if (!evaluated) {
10
+ el.style.display = "none !important";
11
+ } else {
12
+ el.style.display = '';
13
+ }
14
+ }
15
+
16
+ export function geoip_detect2_shortcode_evaluate_conditions(parsed, opt, record) {
17
+ const alternativePropertyNames = [
18
+ 'name',
19
+ 'iso_code',
20
+ 'iso_code3',
21
+ 'code',
22
+ 'geoname_id',
23
+ ];
24
+
25
+ let isConditionMatching = (parsed.op === 'or') ? false : true;
26
+
27
+ parsed.conditions.forEach(c => {
28
+ let subConditionMatching = false;
29
+ let values = [];
30
+
31
+ const raw_value = record.get_raw(c.p);
32
+
33
+ if (raw_value === null) {
34
+ subConditionMatching = false;
35
+ } else {
36
+ if (typeof (raw_value) === 'object') {
37
+ alternativePropertyNames.forEach(name => {
38
+ if (raw_value[name]) {
39
+ values.push(raw_value[name]);
40
+ } else if (name == 'name') {
41
+ values.push(record.get_with_locales(c.p, opt.lang));
42
+ }
43
+ })
44
+ } else {
45
+ values = [raw_value]
46
+ }
47
+ }
48
+
49
+ subConditionMatching = geoip_detect2_shortcode_check_subcondition(c.v, values);
50
+
51
+ if (c.not) {
52
+ subConditionMatching = !subConditionMatching;
53
+ }
54
+
55
+ if (parsed.op === 'or') {
56
+ isConditionMatching = isConditionMatching || subConditionMatching;
57
+ } else {
58
+ isConditionMatching = isConditionMatching && subConditionMatching;
59
+ }
60
+
61
+ });
62
+
63
+ if (parsed.not) {
64
+ isConditionMatching = !isConditionMatching;
65
+ }
66
+
67
+ return isConditionMatching;
68
+ }
69
+
70
+ function geoip_detect2_shortcode_check_subcondition(expectedValues, actualValues) {
71
+ if (actualValues[0] === true) {
72
+ actualValues = ['true', 'yes', 'y', '1'];
73
+ } else if (actualValues[0] === false) {
74
+ actualValues = ['false', 'no', 'n', '0', ''];
75
+ }
76
+
77
+ actualValues = actualValues.map(x => String(x).toLowerCase())
78
+
79
+ expectedValues = expectedValues.split(',');
80
+
81
+ const intersect = _.intersection(expectedValues, actualValues);
82
+
83
+ return intersect.length > 0;
84
+ }
js/shortcodes/show-if.test.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { getTestRecordError, getTestRecord } = require("../test-lib/test-records");
2
+ import { geoip_detect2_shortcode_evaluate_conditions } from './show-if';
3
+
4
+ const testFixture = require('../../tests/fixture_shortcode_show_if.json');
5
+
6
+
7
+ test.each(testFixture)('Show if Test #%d: %s', (nb, input, expected, parsed, opt) => {
8
+ const record = getTestRecord(opt.lang);
9
+ const result = geoip_detect2_shortcode_evaluate_conditions(parsed, opt, record);
10
+ expect(result).toBe(expected);
11
+ });
12
+
js/test-lib/test-records.js ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Record from "../models/record"
2
+
3
+ // From Maxmind City Lite
4
+ export function getTestRecord(locales) {
5
+ return new Record({
6
+ "country": {
7
+ "iso_code": "DE",
8
+ "iso_code3": "DEU",
9
+ "geoname_id": 2921044,
10
+ "names": {
11
+ "en": "Germany",
12
+ "de": "Deutschland",
13
+ "it": "Germania",
14
+ "es": "Alemania",
15
+ "fr": "Allemagne",
16
+ "ja": "ドイツ連邦共和国",
17
+ "pt-BR": "Alemanha",
18
+ "ru": "Германия",
19
+ "zh-CN": "德国"
20
+ }
21
+ },
22
+ "continent": {
23
+ "code": "EU",
24
+ "names": {
25
+ "en": "Europe",
26
+ "de": "Europa",
27
+ "it": "Europa",
28
+ "es": "Europa",
29
+ "fr": "Europe",
30
+ "ja": "ヨーロッパ",
31
+ "pt-BR": "Europa",
32
+ "ru": "Европа",
33
+ "zh-CN": "欧洲"
34
+ },
35
+ "geoname_id": 6255148
36
+ },
37
+ "location": {
38
+ "latitude": 50.1333,
39
+ "longitude": 8.55,
40
+ "time_zone": "Europe/Berlin"
41
+ },
42
+ "extra": {
43
+ "currency_code": "EUR",
44
+ "source": "manual",
45
+ "cached": 0,
46
+ "error": "",
47
+ "country_iso_code3": "DEU",
48
+ "flag": "🇩🇪",
49
+ "tel": "+49"
50
+ },
51
+ "city": {
52
+ "geoname_id": 2929134,
53
+ "names": {
54
+ "en": "Eschborn",
55
+ "ja": "エシュボルン",
56
+ "ru": "Эшборн",
57
+ "zh-CN": "埃施博尔恩"
58
+ }
59
+ },
60
+ "registered_country": {
61
+ "geoname_id": 2921044,
62
+ "iso_code": "DE",
63
+ "names": {
64
+ "de": "Deutschland",
65
+ "en": "Germany",
66
+ "es": "Alemania",
67
+ "fr": "Allemagne",
68
+ "ja": "ドイツ連邦共和国",
69
+ "pt-BR": "Alemanha",
70
+ "ru": "Германия",
71
+ "zh-CN": "德国"
72
+ }
73
+ },
74
+ "subdivisions": [
75
+ {
76
+ "geoname_id": 2905330,
77
+ "iso_code": "HE",
78
+ "names": {
79
+ "de": "Hessen",
80
+ "en": "Hesse",
81
+ "es": "Hessen",
82
+ "fr": "Hesse"
83
+ }
84
+ }
85
+ ],
86
+ "traits": {
87
+ "ip_address": "88.64.140.1",
88
+ "prefix_len": 24
89
+ },
90
+ "is_empty": false,
91
+ "most_specific_subdivision": {
92
+ "geoname_id": 2905330,
93
+ "iso_code": "HE",
94
+ "names": {
95
+ "de": "Hessen",
96
+ "en": "Hesse",
97
+ "es": "Hessen",
98
+ "fr": "Hesse"
99
+ }
100
+ }
101
+ }, locales);
102
+ }
103
+
104
+ export function getTestRecordError() {
105
+ return new Record({
106
+ "traits": {
107
+ "ip_address": "127.0.0.1"
108
+ },
109
+ "is_empty": true,
110
+ "extra": {
111
+ "source": "manual",
112
+ "cached": 0,
113
+ "error": "No reader was found. Check if the configuration is complete and correct."
114
+ }
115
+ });
116
+ }
lib/ccpa.php CHANGED
@@ -49,11 +49,10 @@ class CcpaBlacklistOnLookup {
49
  $exclusionReason = $this->ipOnListGetReason($ip);
50
 
51
  if ($exclusionReason) {
52
- $data = array();
53
  $currentSourceId = DataSourceRegistry::getInstance()->getSource($options['source'])->getId();
54
  $errorMessage = sprintf(__('This IP has no informations attached by request of the IP owner (Reason: %s).', 'geoip-detect'), $exclusionReason);
55
 
56
- $data = _geoip_detect2_record_enrich_data($data, $ip, $currentSourceId, $errorMessage);
57
  }
58
  return $data;
59
  }
@@ -180,6 +179,8 @@ class RetrieveCcpaBlacklist {
180
  }
181
 
182
  public function doUpdate() {
 
 
183
  /**
184
  * With this filter, you can disable checking the Maxmind Server for CCPA blacklist updates.
185
  * @return boolean if the Update should be done (TRUE) or not (FALSE)
49
  $exclusionReason = $this->ipOnListGetReason($ip);
50
 
51
  if ($exclusionReason) {
 
52
  $currentSourceId = DataSourceRegistry::getInstance()->getSource($options['source'])->getId();
53
  $errorMessage = sprintf(__('This IP has no informations attached by request of the IP owner (Reason: %s).', 'geoip-detect'), $exclusionReason);
54
 
55
+ $data = _geoip_detect2_record_enrich_data(null, $ip, $currentSourceId, $errorMessage);
56
  }
57
  return $data;
58
  }
179
  }
180
 
181
  public function doUpdate() {
182
+ (new CcpaBlacklistCron)->schedule();
183
+
184
  /**
185
  * With this filter, you can disable checking the Maxmind Server for CCPA blacklist updates.
186
  * @return boolean if the Update should be done (TRUE) or not (FALSE)
lib/get-client-ip.php CHANGED
@@ -67,7 +67,7 @@ class GetClientIp {
67
  return $ip_list_reverse;
68
  }
69
 
70
- public function getIp($useReverseProxy = false) {
71
  $ip_list = $this->getIpsFromRemoteAddr();
72
 
73
  if ($useReverseProxy)
67
  return $ip_list_reverse;
68
  }
69
 
70
+ public function getIp($useReverseProxy = false) : string {
71
  $ip_list = $this->getIpsFromRemoteAddr();
72
 
73
  if ($useReverseProxy)
lib/timezone.php ADDED
@@ -0,0 +1,2241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // From: https://github.com/maxmind/geoip-api-php/blob/master/src/timezone.php
3
+ // Licenced GNU GPL 2.1+
4
+
5
+
6
+ function _geoip_detect_get_time_zone($country, $region = '')
7
+ {
8
+ $timezone = "";
9
+
10
+ switch ($country) {
11
+ case "AD":
12
+ $timezone = "Europe/Andorra";
13
+ break;
14
+ case "AE":
15
+ $timezone = "Asia/Dubai";
16
+ break;
17
+ case "AF":
18
+ $timezone = "Asia/Kabul";
19
+ break;
20
+ case "AG":
21
+ $timezone = "America/Antigua";
22
+ break;
23
+ case "AI":
24
+ $timezone = "America/Anguilla";
25
+ break;
26
+ case "AL":
27
+ $timezone = "Europe/Tirane";
28
+ break;
29
+ case "AM":
30
+ $timezone = "Asia/Yerevan";
31
+ break;
32
+ case "AN":
33
+ $timezone = "America/Curacao";
34
+ break;
35
+ case "AO":
36
+ $timezone = "Africa/Luanda";
37
+ break;
38
+ case "AQ":
39
+ $timezone = "Antarctica/South_Pole";
40
+ break;
41
+ case "AR":
42
+ switch ($region) {
43
+ case "01":
44
+ $timezone = "America/Argentina/Buenos_Aires";
45
+ break;
46
+ case "02":
47
+ $timezone = "America/Argentina/Catamarca";
48
+ break;
49
+ case "03":
50
+ $timezone = "America/Argentina/Tucuman";
51
+ break;
52
+ case "04":
53
+ $timezone = "America/Argentina/Rio_Gallegos";
54
+ break;
55
+ case "05":
56
+ $timezone = "America/Argentina/Cordoba";
57
+ break;
58
+ case "06":
59
+ $timezone = "America/Argentina/Tucuman";
60
+ break;
61
+ case "07":
62
+ $timezone = "America/Argentina/Buenos_Aires";
63
+ break;
64
+ case "08":
65
+ $timezone = "America/Argentina/Buenos_Aires";
66
+ break;
67
+ case "09":
68
+ $timezone = "America/Argentina/Tucuman";
69
+ break;
70
+ case "10":
71
+ $timezone = "America/Argentina/Jujuy";
72
+ break;
73
+ case "11":
74
+ $timezone = "America/Argentina/San_Luis";
75
+ break;
76
+ case "12":
77
+ $timezone = "America/Argentina/La_Rioja";
78
+ break;
79
+ case "13":
80
+ $timezone = "America/Argentina/Mendoza";
81
+ break;
82
+ case "14":
83
+ $timezone = "America/Argentina/Buenos_Aires";
84
+ break;
85
+ case "15":
86
+ $timezone = "America/Argentina/San_Luis";
87
+ break;
88
+ case "16":
89
+ $timezone = "America/Argentina/Buenos_Aires";
90
+ break;
91
+ case "17":
92
+ $timezone = "America/Argentina/Salta";
93
+ break;
94
+ case "18":
95
+ $timezone = "America/Argentina/San_Juan";
96
+ break;
97
+ case "19":
98
+ $timezone = "America/Argentina/San_Luis";
99
+ break;
100
+ case "20":
101
+ $timezone = "America/Argentina/Rio_Gallegos";
102
+ break;
103
+ case "21":
104
+ $timezone = "America/Argentina/Buenos_Aires";
105
+ break;
106
+ case "22":
107
+ $timezone = "America/Argentina/Catamarca";
108
+ break;
109
+ case "23":
110
+ $timezone = "America/Argentina/Ushuaia";
111
+ break;
112
+ case "24":
113
+ $timezone = "America/Argentina/Tucuman";
114
+ break;
115
+ }
116
+ break;
117
+ case "AS":
118
+ $timezone = "Pacific/Pago_Pago";
119
+ break;
120
+ case "AT":
121
+ $timezone = "Europe/Vienna";
122
+ break;
123
+ case "AU":
124
+ switch ($region) {
125
+ case "01":
126
+ $timezone = "Australia/Sydney";
127
+ break;
128
+ case "02":
129
+ $timezone = "Australia/Sydney";
130
+ break;
131
+ case "03":
132
+ $timezone = "Australia/Darwin";
133
+ break;
134
+ case "04":
135
+ $timezone = "Australia/Brisbane";
136
+ break;
137
+ case "05":
138
+ $timezone = "Australia/Adelaide";
139
+ break;
140
+ case "06":
141
+ $timezone = "Australia/Hobart";
142
+ break;
143
+ case "07":
144
+ $timezone = "Australia/Melbourne";
145
+ break;
146
+ case "08":
147
+ $timezone = "Australia/Perth";
148
+ break;
149
+ }
150
+ break;
151
+ case "AW":
152
+ $timezone = "America/Aruba";
153
+ break;
154
+ case "AX":
155
+ $timezone = "Europe/Mariehamn";
156
+ break;
157
+ case "AZ":
158
+ $timezone = "Asia/Baku";
159
+ break;
160
+ case "BA":
161
+ $timezone = "Europe/Sarajevo";
162
+ break;
163
+ case "BB":
164
+ $timezone = "America/Barbados";
165
+ break;
166
+ case "BD":
167
+ $timezone = "Asia/Dhaka";
168
+ break;
169
+ case "BE":
170
+ $timezone = "Europe/Brussels";
171
+ break;
172
+ case "BF":
173
+ $timezone = "Africa/Ouagadougou";
174
+ break;
175
+ case "BG":
176
+ $timezone = "Europe/Sofia";
177
+ break;
178
+ case "BH":
179
+ $timezone = "Asia/Bahrain";
180
+ break;
181
+ case "BI":
182
+ $timezone = "Africa/Bujumbura";
183
+ break;
184
+ case "BJ":
185
+ $timezone = "Africa/Porto-Novo";
186
+ break;
187
+ case "BL":
188
+ $timezone = "America/St_Barthelemy";
189
+ break;
190
+ case "BM":
191
+ $timezone = "Atlantic/Bermuda";
192
+ break;
193
+ case "BN":
194
+ $timezone = "Asia/Brunei";
195
+ break;
196
+ case "BO":
197
+ $timezone = "America/La_Paz";
198
+ break;
199
+ case "BQ":
200
+ $timezone = "America/Curacao";
201
+ break;
202
+ case "BR":
203
+ switch ($region) {
204
+ case "01":
205
+ $timezone = "America/Rio_Branco";
206
+ break;
207
+ case "02":
208
+ $timezone = "America/Maceio";
209
+ break;
210
+ case "03":
211
+ $timezone = "America/Sao_Paulo";
212
+ break;
213
+ case "04":
214
+ $timezone = "America/Manaus";
215
+ break;
216
+ case "05":
217
+ $timezone = "America/Bahia";
218
+ break;
219
+ case "06":
220
+ $timezone = "America/Fortaleza";
221
+ break;
222
+ case "07":
223
+ $timezone = "America/Sao_Paulo";
224
+ break;
225
+ case "08":
226
+ $timezone = "America/Sao_Paulo";
227
+ break;
228
+ case "11":
229
+ $timezone = "America/Campo_Grande";
230
+ break;
231
+ case "13":
232
+ $timezone = "America/Belem";
233
+ break;
234
+ case "14":
235
+ $timezone = "America/Cuiaba";
236
+ break;
237
+ case "15":
238
+ $timezone = "America/Sao_Paulo";
239
+ break;
240
+ case "16":
241
+ $timezone = "America/Belem";
242
+ break;
243
+ case "17":
244
+ $timezone = "America/Recife";
245
+ break;
246
+ case "18":
247
+ $timezone = "America/Sao_Paulo";
248
+ break;
249
+ case "20":
250
+ $timezone = "America/Fortaleza";
251
+ break;
252
+ case "21":
253
+ $timezone = "America/Sao_Paulo";
254
+ break;
255
+ case "22":
256
+ $timezone = "America/Recife";
257
+ break;
258
+ case "23":
259
+ $timezone = "America/Sao_Paulo";
260
+ break;
261
+ case "24":
262
+ $timezone = "America/Porto_Velho";
263
+ break;
264
+ case "25":
265
+ $timezone = "America/Boa_Vista";
266
+ break;
267
+ case "26":
268
+ $timezone = "America/Sao_Paulo";
269
+ break;
270
+ case "27":
271
+ $timezone = "America/Sao_Paulo";
272
+ break;
273
+ case "28":
274
+ $timezone = "America/Maceio";
275
+ break;
276
+ case "29":
277
+ $timezone = "America/Sao_Paulo";
278
+ break;
279
+ case "30":
280
+ $timezone = "America/Recife";
281
+ break;
282
+ case "31":
283
+ $timezone = "America/Araguaina";
284
+ break;
285
+ }
286
+ break;
287
+ case "BS":
288
+ $timezone = "America/Nassau";
289
+ break;
290
+ case "BT":
291
+ $timezone = "Asia/Thimphu";
292
+ break;
293
+ case "BV":
294
+ $timezone = "Antarctica/Syowa";
295
+ break;
296
+ case "BW":
297
+ $timezone = "Africa/Gaborone";
298
+ break;
299
+ case "BY":
300
+ $timezone = "Europe/Minsk";
301
+ break;
302
+ case "BZ":
303
+ $timezone = "America/Belize";
304
+ break;
305
+ case "CA":
306
+ switch ($region) {
307
+ case "AB":
308
+ $timezone = "America/Edmonton";
309
+ break;
310
+ case "BC":
311
+ $timezone = "America/Vancouver";
312
+ break;
313
+ case "MB":
314
+ $timezone = "America/Winnipeg";
315
+ break;
316
+ case "NB":
317
+ $timezone = "America/Halifax";
318
+ break;
319
+ case "NL":
320
+ $timezone = "America/St_Johns";
321
+ break;
322
+ case "NS":
323
+ $timezone = "America/Halifax";
324
+ break;
325
+ case "NT":
326
+ $timezone = "America/Yellowknife";
327
+ break;
328
+ case "NU":
329
+ $timezone = "America/Rankin_Inlet";
330
+ break;
331
+ case "ON":
332
+ $timezone = "America/Toronto";
333
+ break;
334
+ case "PE":
335
+ $timezone = "America/Halifax";
336
+ break;
337
+ case "QC":
338
+ $timezone = "America/Montreal";
339
+ break;
340
+ case "SK":
341
+ $timezone = "America/Regina";
342
+ break;
343
+ case "YT":
344
+ $timezone = "America/Whitehorse";
345
+ break;
346
+ }
347
+ break;
348
+ case "CC":
349
+ $timezone = "Indian/Cocos";
350
+ break;
351
+ case "CD":
352
+ switch ($region) {
353
+ case "01":
354
+ $timezone = "Africa/Kinshasa";
355
+ break;
356
+ case "02":
357
+ $timezone = "Africa/Kinshasa";
358
+ break;
359
+ case "03":
360
+ $timezone = "Africa/Kinshasa";
361
+ break;
362
+ case "04":
363
+ $timezone = "Africa/Lubumbashi";
364
+ break;
365
+ case "05":
366
+ $timezone = "Africa/Lubumbashi";
367
+ break;
368
+ case "06":
369
+ $timezone = "Africa/Kinshasa";
370
+ break;
371
+ case "07":
372
+ $timezone = "Africa/Lubumbashi";
373
+ break;
374
+ case "08":
375
+ $timezone = "Africa/Kinshasa";
376
+ break;
377
+ case "09":
378
+ $timezone = "Africa/Lubumbashi";
379
+ break;
380
+ case "10":
381
+ $timezone = "Africa/Lubumbashi";
382
+ break;
383
+ case "11":
384
+ $timezone = "Africa/Lubumbashi";
385
+ break;
386
+ case "12":
387
+ $timezone = "Africa/Lubumbashi";
388
+ break;
389
+ }
390
+ break;
391
+ case "CF":
392
+ $timezone = "Africa/Bangui";
393
+ break;
394
+ case "CG":
395
+ $timezone = "Africa/Brazzaville";
396
+ break;
397
+ case "CH":
398
+ $timezone = "Europe/Zurich";
399
+ break;
400
+ case "CI":
401
+ $timezone = "Africa/Abidjan";
402
+ break;
403
+ case "CK":
404
+ $timezone = "Pacific/Rarotonga";
405
+ break;
406
+ case "CL":
407
+ $timezone = "America/Santiago";
408
+ break;
409
+ case "CM":
410
+ $timezone = "Africa/Lagos";
411
+ break;
412
+ case "CN":
413
+ switch ($region) {
414
+ case "01":
415
+ $timezone = "Asia/Shanghai";
416
+ break;
417
+ case "02":
418
+ $timezone = "Asia/Shanghai";
419
+ break;
420
+ case "03":
421
+ $timezone = "Asia/Shanghai";
422
+ break;
423
+ case "04":
424
+ $timezone = "Asia/Shanghai";
425
+ break;
426
+ case "05":
427
+ $timezone = "Asia/Harbin";
428
+ break;
429
+ case "06":
430
+ $timezone = "Asia/Chongqing";
431
+ break;
432
+ case "07":
433
+ $timezone = "Asia/Shanghai";
434
+ break;
435
+ case "08":
436
+ $timezone = "Asia/Harbin";
437
+ break;
438
+ case "09":
439
+ $timezone = "Asia/Shanghai";
440
+ break;
441
+ case "10":
442
+ $timezone = "Asia/Shanghai";
443
+ break;
444
+ case "11":
445
+ $timezone = "Asia/Chongqing";
446
+ break;
447
+ case "12":
448
+ $timezone = "Asia/Shanghai";
449
+ break;
450
+ case "13":
451
+ $timezone = "Asia/Urumqi";
452
+ break;
453
+ case "14":
454
+ $timezone = "Asia/Chongqing";
455
+ break;
456
+ case "15":
457
+ $timezone = "Asia/Chongqing";
458
+ break;
459
+ case "16":
460
+ $timezone = "Asia/Chongqing";
461
+ break;
462
+ case "18":
463
+ $timezone = "Asia/Chongqing";
464
+ break;
465
+ case "19":
466
+ $timezone = "Asia/Harbin";
467
+ break;
468
+ case "20":
469
+ $timezone = "Asia/Harbin";
470
+ break;
471
+ case "21":
472
+ $timezone = "Asia/Chongqing";
473
+ break;
474
+ case "22":
475
+ $timezone = "Asia/Harbin";
476
+ break;
477
+ case "23":
478
+ $timezone = "Asia/Shanghai";
479
+ break;
480
+ case "24":
481
+ $timezone = "Asia/Chongqing";
482
+ break;
483
+ case "25":
484
+ $timezone = "Asia/Shanghai";
485
+ break;
486
+ case "26":
487
+ $timezone = "Asia/Chongqing";
488
+ break;
489
+ case "28":
490
+ $timezone = "Asia/Shanghai";
491
+ break;
492
+ case "29":
493
+ $timezone = "Asia/Chongqing";
494
+ break;
495
+ case "30":
496
+ $timezone = "Asia/Chongqing";
497
+ break;
498
+ case "31":
499
+ $timezone = "Asia/Chongqing";
500
+ break;
501
+ case "32":
502
+ $timezone = "Asia/Chongqing";
503
+ break;
504
+ case "33":
505
+ $timezone = "Asia/Chongqing";
506
+ break;
507
+ }
508
+ break;
509
+ case "CO":
510
+ $timezone = "America/Bogota";
511
+ break;
512
+ case "CR":
513
+ $timezone = "America/Costa_Rica";
514
+ break;
515
+ case "CU":
516
+ $timezone = "America/Havana";
517
+ break;
518
+ case "CV":
519
+ $timezone = "Atlantic/Cape_Verde";
520
+ break;
521
+ case "CW":
522
+ $timezone = "America/Curacao";
523
+ break;
524
+ case "CX":
525
+ $timezone = "Indian/Christmas";
526
+ break;
527
+ case "CY":
528
+ $timezone = "Asia/Nicosia";
529
+ break;
530
+ case "CZ":
531
+ $timezone = "Europe/Prague";
532
+ break;
533
+ case "DE":
534
+ $timezone = "Europe/Berlin";
535
+ break;
536
+ case "DJ":
537
+ $timezone = "Africa/Djibouti";
538
+ break;
539
+ case "DK":
540
+ $timezone = "Europe/Copenhagen";
541
+ break;
542
+ case "DM":
543
+ $timezone = "America/Dominica";
544
+ break;
545
+ case "DO":
546
+ $timezone = "America/Santo_Domingo";
547
+ break;
548
+ case "DZ":
549
+ $timezone = "Africa/Algiers";
550
+ break;
551
+ case "EC":
552
+ switch ($region) {
553
+ case "01":
554
+ $timezone = "Pacific/Galapagos";
555
+ break;
556
+ case "02":
557
+ $timezone = "America/Guayaquil";
558
+ break;
559
+ case "03":
560
+ $timezone = "America/Guayaquil";
561
+ break;
562
+ case "04":
563
+ $timezone = "America/Guayaquil";
564
+ break;
565
+ case "05":
566
+ $timezone = "America/Guayaquil";
567
+ break;
568
+ case "06":
569
+ $timezone = "America/Guayaquil";
570
+ break;
571
+ case "07":
572
+ $timezone = "America/Guayaquil";
573
+ break;
574
+ case "08":
575
+ $timezone = "America/Guayaquil";
576
+ break;
577
+ case "09":
578
+ $timezone = "America/Guayaquil";
579
+ break;
580
+ case "10":
581
+ $timezone = "America/Guayaquil";
582
+ break;
583
+ case "11":
584
+ $timezone = "America/Guayaquil";
585
+ break;
586
+ case "12":
587
+ $timezone = "America/Guayaquil";
588
+ break;
589
+ case "13":
590
+ $timezone = "America/Guayaquil";
591
+ break;
592
+ case "14":
593
+ $timezone = "America/Guayaquil";
594
+ break;
595
+ case "15":
596
+ $timezone = "America/Guayaquil";
597
+ break;
598
+ case "17":
599
+ $timezone = "America/Guayaquil";
600
+ break;
601
+ case "18":
602
+ $timezone = "America/Guayaquil";
603
+ break;
604
+ case "19":
605
+ $timezone = "America/Guayaquil";
606
+ break;
607
+ case "20":
608
+ $timezone = "America/Guayaquil";
609
+ break;
610
+ case "22":
611
+ $timezone = "America/Guayaquil";
612
+ break;
613
+ case "24":
614
+ $timezone = "America/Guayaquil";
615
+ break;
616
+ }
617
+ break;
618
+ case "EE":
619
+ $timezone = "Europe/Tallinn";
620
+ break;
621
+ case "EG":
622
+ $timezone = "Africa/Cairo";
623
+ break;
624
+ case "EH":
625
+ $timezone = "Africa/El_Aaiun";
626
+ break;
627
+ case "ER":
628
+ $timezone = "Africa/Asmara";
629
+ break;
630
+ case "ES":
631
+ switch ($region) {
632
+ case "07":
633
+ $timezone = "Europe/Madrid";
634
+ break;
635
+ case "27":
636
+ $timezone = "Europe/Madrid";
637
+ break;
638
+ case "29":
639
+ $timezone = "Europe/Madrid";
640
+ break;
641
+ case "31":
642
+ $timezone = "Europe/Madrid";
643
+ break;
644
+ case "32":
645
+ $timezone = "Europe/Madrid";
646
+ break;
647
+ case "34":
648
+ $timezone = "Europe/Madrid";
649
+ break;
650
+ case "39":
651
+ $timezone = "Europe/Madrid";
652
+ break;
653
+ case "51":
654
+ $timezone = "Africa/Ceuta";
655
+ break;
656
+ case "52":
657
+ $timezone = "Europe/Madrid";
658
+ break;
659
+ case "53":
660
+ $timezone = "Atlantic/Canary";
661
+ break;
662
+ case "54":
663
+ $timezone = "Europe/Madrid";
664
+ break;
665
+ case "55":
666
+ $timezone = "Europe/Madrid";
667
+ break;
668
+ case "56":
669
+ $timezone = "Europe/Madrid";
670
+ break;
671
+ case "57":
672
+ $timezone = "Europe/Madrid";
673
+ break;
674
+ case "58":
675
+ $timezone = "Europe/Madrid";
676
+ break;
677
+ case "59":
678
+ $timezone = "Europe/Madrid";
679
+ break;
680
+ case "60":
681
+ $timezone = "Europe/Madrid";
682
+ break;
683
+ }
684
+ break;
685
+ case "ET":
686
+ $timezone = "Africa/Addis_Ababa";
687
+ break;
688
+ case "FI":
689
+ $timezone = "Europe/Helsinki";
690
+ break;
691
+ case "FJ":
692
+ $timezone = "Pacific/Fiji";
693
+ break;
694
+ case "FK":
695
+ $timezone = "Atlantic/Stanley";
696
+ break;
697
+ case "FM":
698
+ $timezone = "Pacific/Pohnpei";
699
+ break;
700
+ case "FO":
701
+ $timezone = "Atlantic/Faroe";
702
+ break;
703
+ case "FR":
704
+ $timezone = "Europe/Paris";
705
+ break;
706
+ case "FX":
707
+ $timezone = "Europe/Paris";
708
+ break;
709
+ case "GA":
710
+ $timezone = "Africa/Libreville";
711
+ break;
712
+ case "GB":
713
+ $timezone = "Europe/London";
714
+ break;
715
+ case "GD":
716
+ $timezone = "America/Grenada";
717
+ break;
718
+ case "GE":
719
+ $timezone = "Asia/Tbilisi";
720
+ break;
721
+ case "GF":
722
+ $timezone = "America/Cayenne";
723
+ break;
724
+ case "GG":
725
+ $timezone = "Europe/Guernsey";
726
+ break;
727
+ case "GH":
728
+ $timezone = "Africa/Accra";
729
+ break;
730
+ case "GI":
731
+ $timezone = "Europe/Gibraltar";
732
+ break;
733
+ case "GL":
734
+ switch ($region) {
735
+ case "01":
736
+ $timezone = "America/Thule";
737
+ break;
738
+ case "02":
739
+ $timezone = "America/Godthab";
740
+ break;
741
+ case "03":
742
+ $timezone = "America/Godthab";
743
+ break;
744
+ }
745
+ break;
746
+ case "GM":
747
+ $timezone = "Africa/Banjul";
748
+ break;
749
+ case "GN":
750
+ $timezone = "Africa/Conakry";
751
+ break;
752
+ case "GP":
753
+ $timezone = "America/Guadeloupe";
754
+ break;
755
+ case "GQ":
756
+ $timezone = "Africa/Malabo";
757
+ break;
758
+ case "GR":
759
+ $timezone = "Europe/Athens";
760
+ break;
761
+ case "GS":
762
+ $timezone = "Atlantic/South_Georgia";
763
+ break;
764
+ case "GT":
765
+ $timezone = "America/Guatemala";
766
+ break;
767
+ case "GU":
768
+ $timezone = "Pacific/Guam";
769
+ break;
770
+ case "GW":
771
+ $timezone = "Africa/Bissau";
772
+ break;
773
+ case "GY":
774
+ $timezone = "America/Guyana";
775
+ break;
776
+ case "HK":
777
+ $timezone = "Asia/Hong_Kong";
778
+ break;
779
+ case "HN":
780
+ $timezone = "America/Tegucigalpa";
781
+ break;
782
+ case "HR":
783
+ $timezone = "Europe/Zagreb";
784
+ break;
785
+ case "HT":
786
+ $timezone = "America/Port-au-Prince";
787
+ break;
788
+ case "HU":
789
+ $timezone = "Europe/Budapest";
790
+ break;
791
+ case "ID":
792
+ switch ($region) {
793
+ case "01":
794
+ $timezone = "Asia/Pontianak";
795
+ break;
796
+ case "02":
797
+ $timezone = "Asia/Makassar";
798
+ break;
799
+ case "03":
800
+ $timezone = "Asia/Jakarta";
801
+ break;
802
+ case "04":
803
+ $timezone = "Asia/Jakarta";
804
+ break;
805
+ case "05":
806
+ $timezone = "Asia/Jakarta";
807
+ break;
808
+ case "06":
809
+ $timezone = "Asia/Jakarta";
810
+ break;
811
+ case "07":
812
+ $timezone = "Asia/Jakarta";
813
+ break;
814
+ case "08":
815
+ $timezone = "Asia/Jakarta";
816
+ break;
817
+ case "09":
818
+ $timezone = "Asia/Jayapura";
819
+ break;
820
+ case "10":
821
+ $timezone = "Asia/Jakarta";
822
+ break;
823
+ case "11":
824
+ $timezone = "Asia/Pontianak";
825
+ break;
826
+ case "12":
827
+ $timezone = "Asia/Makassar";
828
+ break;
829
+ case "13":
830
+ $timezone = "Asia/Makassar";
831
+ break;
832
+ case "14":
833
+ $timezone = "Asia/Makassar";
834
+ break;
835
+ case "15":
836
+ $timezone = "Asia/Jakarta";
837
+ break;
838
+ case "16":
839
+ $timezone = "Asia/Makassar";
840
+ break;
841
+ case "17":
842
+ $timezone = "Asia/Makassar";
843
+ break;
844
+ case "18":
845
+ $timezone = "Asia/Makassar";
846
+ break;
847
+ case "19":
848
+ $timezone = "Asia/Pontianak";
849
+ break;
850
+ case "20":
851
+ $timezone = "Asia/Makassar";
852
+ break;
853
+ case "21":
854
+ $timezone = "Asia/Makassar";
855
+ break;
856
+ case "22":
857
+ $timezone = "Asia/Makassar";
858
+ break;
859
+ case "23":
860
+ $timezone = "Asia/Makassar";
861
+ break;
862
+ case "24":
863
+ $timezone = "Asia/Jakarta";
864
+ break;
865
+ case "25":
866
+ $timezone = "Asia/Pontianak";
867
+ break;
868
+ case "26":
869
+ $timezone = "Asia/Pontianak";
870
+ break;
871
+ case "28":
872
+ $timezone = "Asia/Jayapura";
873
+ break;
874
+ case "29":
875
+ $timezone = "Asia/Makassar";
876
+ break;
877
+ case "30":
878
+ $timezone = "Asia/Jakarta";
879
+ break;
880
+ case "31":
881
+ $timezone = "Asia/Makassar";
882
+ break;
883
+ case "32":
884
+ $timezone = "Asia/Jakarta";
885
+ break;
886
+ case "33":
887
+ $timezone = "Asia/Jakarta";
888
+ break;
889
+ case "34":
890
+ $timezone = "Asia/Makassar";
891
+ break;
892
+ case "35":
893
+ $timezone = "Asia/Pontianak";
894
+ break;
895
+ case "36":
896
+ $timezone = "Asia/Jayapura";
897
+ break;
898
+ case "37":
899
+ $timezone = "Asia/Pontianak";
900
+ break;
901
+ case "38":
902
+ $timezone = "Asia/Makassar";
903
+ break;
904
+ case "39":
905
+ $timezone = "Asia/Jayapura";
906
+ break;
907
+ case "40":
908
+ $timezone = "Asia/Pontianak";
909
+ break;
910
+ case "41":
911
+ $timezone = "Asia/Makassar";
912
+ break;
913
+ }
914
+ break;
915
+ case "IE":
916
+ $timezone = "Europe/Dublin";
917
+ break;
918
+ case "IL":
919
+ $timezone = "Asia/Jerusalem";
920
+ break;
921
+ case "IM":
922
+ $timezone = "Europe/Isle_of_Man";
923
+ break;
924
+ case "IN":
925
+ $timezone = "Asia/Kolkata";
926
+ break;
927
+ case "IO":
928
+ $timezone = "Indian/Chagos";
929
+ break;
930
+ case "IQ":
931
+ $timezone = "Asia/Baghdad";
932
+ break;
933
+ case "IR":
934
+ $timezone = "Asia/Tehran";
935
+ break;
936
+ case "IS":
937
+ $timezone = "Atlantic/Reykjavik";
938
+ break;
939
+ case "IT":
940
+ $timezone = "Europe/Rome";
941
+ break;
942
+ case "JE":
943
+ $timezone = "Europe/Jersey";
944
+ break;
945
+ case "JM":
946
+ $timezone = "America/Jamaica";
947
+ break;
948
+ case "JO":
949
+ $timezone = "Asia/Amman";
950
+ break;
951
+ case "JP":
952
+ $timezone = "Asia/Tokyo";
953
+ break;
954
+ case "KE":
955
+ $timezone = "Africa/Nairobi";
956
+ break;
957
+ case "KG":
958
+ $timezone = "Asia/Bishkek";
959
+ break;
960
+ case "KH":
961
+ $timezone = "Asia/Phnom_Penh";
962
+ break;
963
+ case "KI":
964
+ $timezone = "Pacific/Tarawa";
965
+ break;
966
+ case "KM":
967
+ $timezone = "Indian/Comoro";
968
+ break;
969
+ case "KN":
970
+ $timezone = "America/St_Kitts";
971
+ break;
972
+ case "KP":
973
+ $timezone = "Asia/Pyongyang";
974
+ break;
975
+ case "KR":
976
+ $timezone = "Asia/Seoul";
977
+ break;
978
+ case "KW":
979
+ $timezone = "Asia/Kuwait";
980
+ break;
981
+ case "KY":
982
+ $timezone = "America/Cayman";
983
+ break;
984
+ case "KZ":
985
+ switch ($region) {
986
+ case "01":
987
+ $timezone = "Asia/Almaty";
988
+ break;
989
+ case "02":
990
+ $timezone = "Asia/Almaty";
991
+ break;
992
+ case "03":
993
+ $timezone = "Asia/Qyzylorda";
994
+ break;
995
+ case "04":
996
+ $timezone = "Asia/Aqtobe";
997
+ break;
998
+ case "05":
999
+ $timezone = "Asia/Qyzylorda";
1000
+ break;
1001
+ case "06":
1002
+ $timezone = "Asia/Aqtau";
1003
+ break;
1004
+ case "07":
1005
+ $timezone = "Asia/Oral";
1006
+ break;
1007
+ case "08":
1008
+ $timezone = "Asia/Qyzylorda";
1009
+ break;
1010
+ case "09":
1011
+ $timezone = "Asia/Aqtau";
1012
+ break;
1013
+ case "10":
1014
+ $timezone = "Asia/Qyzylorda";
1015
+ break;
1016
+ case "11":
1017
+ $timezone = "Asia/Almaty";
1018
+ break;
1019
+ case "12":
1020
+ $timezone = "Asia/Qyzylorda";
1021
+ break;
1022
+ case "13":
1023
+ $timezone = "Asia/Aqtobe";
1024
+ break;
1025
+ case "14":
1026
+ $timezone = "Asia/Qyzylorda";
1027
+ break;
1028
+ case "15":
1029
+ $timezone = "Asia/Almaty";
1030
+ break;
1031
+ case "16":
1032
+ $timezone = "Asia/Aqtobe";
1033
+ break;
1034
+ case "17":
1035
+ $timezone = "Asia/Almaty";
1036
+ break;
1037
+ }
1038
+ break;
1039
+ case "LA":
1040
+ $timezone = "Asia/Vientiane";
1041
+ break;
1042
+ case "LB":
1043
+ $timezone = "Asia/Beirut";
1044
+ break;
1045
+ case "LC":
1046
+ $timezone = "America/St_Lucia";
1047
+ break;
1048
+ case "LI":
1049
+ $timezone = "Europe/Vaduz";
1050
+ break;
1051
+ case "LK":
1052
+ $timezone = "Asia/Colombo";
1053
+ break;
1054
+ case "LR":
1055
+ $timezone = "Africa/Monrovia";
1056
+ break;
1057
+ case "LS":
1058
+ $timezone = "Africa/Maseru";
1059
+ break;
1060
+ case "LT":
1061
+ $timezone = "Europe/Vilnius";
1062
+ break;
1063
+ case "LU":
1064
+ $timezone = "Europe/Luxembourg";
1065
+ break;
1066
+ case "LV":
1067
+ $timezone = "Europe/Riga";
1068
+ break;
1069
+ case "LY":
1070
+ $timezone = "Africa/Tripoli";
1071
+ break;
1072
+ case "MA":
1073
+ $timezone = "Africa/Casablanca";
1074
+ break;
1075
+ case "MC":
1076
+ $timezone = "Europe/Monaco";
1077
+ break;
1078
+ case "MD":
1079
+ $timezone = "Europe/Chisinau";
1080
+ break;
1081
+ case "ME":
1082
+ $timezone = "Europe/Podgorica";
1083
+ break;
1084
+ case "MF":
1085
+ $timezone = "America/Marigot";
1086
+ break;
1087
+ case "MG":
1088
+ $timezone = "Indian/Antananarivo";
1089
+ break;
1090
+ case "MH":
1091
+ $timezone = "Pacific/Kwajalein";
1092
+ break;
1093
+ case "MK":
1094
+ $timezone = "Europe/Skopje";
1095
+ break;
1096
+ case "ML":
1097
+ $timezone = "Africa/Bamako";
1098
+ break;
1099
+ case "MM":
1100
+ $timezone = "Asia/Rangoon";
1101
+ break;
1102
+ case "MN":
1103
+ switch ($region) {
1104
+ case "06":
1105
+ $timezone = "Asia/Choibalsan";
1106
+ break;
1107
+ case "11":
1108
+ $timezone = "Asia/Ulaanbaatar";
1109
+ break;
1110
+ case "17":
1111
+ $timezone = "Asia/Choibalsan";
1112
+ break;
1113
+ case "19":
1114
+ $timezone = "Asia/Hovd";
1115
+ break;
1116
+ case "20":
1117
+ $timezone = "Asia/Ulaanbaatar";
1118
+ break;
1119
+ case "21":
1120
+ $timezone = "Asia/Ulaanbaatar";
1121
+ break;
1122
+ case "25":
1123
+ $timezone = "Asia/Ulaanbaatar";
1124
+ break;
1125
+ }
1126
+ break;
1127
+ case "MO":
1128
+ $timezone = "Asia/Macau";
1129
+ break;
1130
+ case "MP":
1131
+ $timezone = "Pacific/Saipan";
1132
+ break;
1133
+ case "MQ":
1134
+ $timezone = "America/Martinique";
1135
+ break;
1136
+ case "MR":
1137
+ $timezone = "Africa/Nouakchott";
1138
+ break;
1139
+ case "MS":
1140
+ $timezone = "America/Montserrat";
1141
+ break;
1142
+ case "MT":
1143
+ $timezone = "Europe/Malta";
1144
+ break;
1145
+ case "MU":
1146
+ $timezone = "Indian/Mauritius";
1147
+ break;
1148
+ case "MV":
1149
+ $timezone = "Indian/Maldives";
1150
+ break;
1151
+ case "MW":
1152
+ $timezone = "Africa/Blantyre";
1153
+ break;
1154
+ case "MX":
1155
+ switch ($region) {
1156
+ case "01":
1157
+ $timezone = "America/Mexico_City";
1158
+ break;
1159
+ case "02":
1160
+ $timezone = "America/Tijuana";
1161
+ break;
1162
+ case "03":
1163
+ $timezone = "America/Hermosillo";
1164
+ break;
1165
+ case "04":
1166
+ $timezone = "America/Merida";
1167
+ break;
1168
+ case "05":
1169
+ $timezone = "America/Mexico_City";
1170
+ break;
1171
+ case "06":
1172
+ $timezone = "America/Chihuahua";
1173
+ break;
1174
+ case "07":
1175
+ $timezone = "America/Monterrey";
1176
+ break;
1177
+ case "08":
1178
+ $timezone = "America/Mexico_City";
1179
+ break;
1180
+ case "09":
1181
+ $timezone = "America/Mexico_City";
1182
+ break;
1183
+ case "10":
1184
+ $timezone = "America/Mazatlan";
1185
+ break;
1186
+ case "11":
1187
+ $timezone = "America/Mexico_City";
1188
+ break;
1189
+ case "12":
1190
+ $timezone = "America/Mexico_City";
1191
+ break;
1192
+ case "13":
1193
+ $timezone = "America/Mexico_City";
1194
+ break;
1195
+ case "14":
1196
+ $timezone = "America/Mazatlan";
1197
+ break;
1198
+ case "15":
1199
+ $timezone = "America/Chihuahua";
1200
+ break;
1201
+ case "16":
1202
+ $timezone = "America/Mexico_City";
1203
+ break;
1204
+ case "17":
1205
+ $timezone = "America/Mexico_City";
1206
+ break;
1207
+ case "18":
1208
+ $timezone = "America/Mazatlan";
1209
+ break;
1210
+ case "19":
1211
+ $timezone = "America/Monterrey";
1212
+ break;
1213
+ case "20":
1214
+ $timezone = "America/Mexico_City";
1215
+ break;
1216
+ case "21":
1217
+ $timezone = "America/Mexico_City";
1218
+ break;
1219
+ case "22":
1220
+ $timezone = "America/Mexico_City";
1221
+ break;
1222
+ case "23":
1223
+ $timezone = "America/Cancun";
1224
+ break;
1225
+ case "24":
1226
+ $timezone = "America/Mexico_City";
1227
+ break;
1228
+ case "25":
1229
+ $timezone = "America/Mazatlan";
1230
+ break;
1231
+ case "26":
1232
+ $timezone = "America/Hermosillo";
1233
+ break;
1234
+ case "27":
1235
+ $timezone = "America/Merida";
1236
+ break;
1237
+ case "28":
1238
+ $timezone = "America/Monterrey";
1239
+ break;
1240
+ case "29":
1241
+ $timezone = "America/Mexico_City";
1242
+ break;
1243
+ case "30":
1244
+ $timezone = "America/Mexico_City";
1245
+ break;
1246
+ case "31":
1247
+ $timezone = "America/Merida";
1248
+ break;
1249
+ case "32":
1250
+ $timezone = "America/Monterrey";
1251
+ break;
1252
+ }
1253
+ break;
1254
+ case "MY":
1255
+ switch ($region) {
1256
+ case "01":
1257
+ $timezone = "Asia/Kuala_Lumpur";
1258
+ break;
1259
+ case "02":
1260
+ $timezone = "Asia/Kuala_Lumpur";
1261
+ break;
1262
+ case "03":
1263
+ $timezone = "Asia/Kuala_Lumpur";
1264
+ break;
1265
+ case "04":
1266
+ $timezone = "Asia/Kuala_Lumpur";
1267
+ break;
1268
+ case "05":
1269
+ $timezone = "Asia/Kuala_Lumpur";
1270
+ break;
1271
+ case "06":
1272
+ $timezone = "Asia/Kuala_Lumpur";
1273
+ break;
1274
+ case "07":
1275
+ $timezone = "Asia/Kuala_Lumpur";
1276
+ break;
1277
+ case "08":
1278
+ $timezone = "Asia/Kuala_Lumpur";
1279
+ break;
1280
+ case "09":
1281
+ $timezone = "Asia/Kuala_Lumpur";
1282
+ break;
1283
+ case "11":
1284
+ $timezone = "Asia/Kuching";
1285
+ break;
1286
+ case "12":
1287
+ $timezone = "Asia/Kuala_Lumpur";
1288
+ break;
1289
+ case "13":
1290
+ $timezone = "Asia/Kuala_Lumpur";
1291
+ break;
1292
+ case "14":
1293
+ $timezone = "Asia/Kuala_Lumpur";
1294
+ break;
1295
+ case "15":
1296
+ $timezone = "Asia/Kuching";
1297
+ break;
1298
+ case "16":
1299
+ $timezone = "Asia/Kuching";
1300
+ break;
1301
+ }
1302
+ break;
1303
+ case "MZ":
1304
+ $timezone = "Africa/Maputo";
1305
+ break;
1306
+ case "NA":
1307
+ $timezone = "Africa/Windhoek";
1308
+ break;
1309
+ case "NC":
1310
+ $timezone = "Pacific/Noumea";
1311
+ break;
1312
+ case "NE":
1313
+ $timezone = "Africa/Niamey";
1314
+ break;
1315
+ case "NF":
1316
+ $timezone = "Pacific/Norfolk";
1317
+ break;
1318
+ case "NG":
1319
+ $timezone = "Africa/Lagos";
1320
+ break;
1321
+ case "NI":
1322
+ $timezone = "America/Managua";
1323
+ break;
1324
+ case "NL":
1325
+ $timezone = "Europe/Amsterdam";
1326
+ break;
1327
+ case "NO":
1328
+ $timezone = "Europe/Oslo";
1329
+ break;
1330
+ case "NP":
1331
+ $timezone = "Asia/Kathmandu";
1332
+ break;
1333
+ case "NR":
1334
+ $timezone = "Pacific/Nauru";
1335
+ break;
1336
+ case "NU":
1337
+ $timezone = "Pacific/Niue";
1338
+ break;
1339
+ case "NZ":
1340
+ switch ($region) {
1341
+ case "85":
1342
+ $timezone = "Pacific/Auckland";
1343
+ break;
1344
+ case "E7":
1345
+ $timezone = "Pacific/Auckland";
1346
+ break;
1347
+ case "E8":
1348
+ $timezone = "Pacific/Auckland";
1349
+ break;
1350
+ case "E9":
1351
+ $timezone = "Pacific/Auckland";
1352
+ break;
1353
+ case "F1":
1354
+ $timezone = "Pacific/Auckland";
1355
+ break;
1356
+ case "F2":
1357
+ $timezone = "Pacific/Auckland";
1358
+ break;
1359
+ case "F3":
1360
+ $timezone = "Pacific/Auckland";
1361
+ break;
1362
+ case "F4":
1363
+ $timezone = "Pacific/Auckland";
1364
+ break;
1365
+ case "F5":
1366
+ $timezone = "Pacific/Auckland";
1367
+ break;
1368
+ case "F6":
1369
+ $timezone = "Pacific/Auckland";
1370
+ break;
1371
+ case "F7":
1372
+ $timezone = "Pacific/Chatham";
1373
+ break;
1374
+ case "F8":
1375
+ $timezone = "Pacific/Auckland";
1376
+ break;
1377
+ case "F9":
1378
+ $timezone = "Pacific/Auckland";
1379
+ break;
1380
+ case "G1":
1381
+ $timezone = "Pacific/Auckland";
1382
+ break;
1383
+ case "G2":
1384
+ $timezone = "Pacific/Auckland";
1385
+ break;
1386
+ case "G3":
1387
+ $timezone = "Pacific/Auckland";
1388
+ break;
1389
+ }
1390
+ break;
1391
+ case "OM":
1392
+ $timezone = "Asia/Muscat";
1393
+ break;
1394
+ case "PA":
1395
+ $timezone = "America/Panama";
1396
+ break;
1397
+ case "PE":
1398
+ $timezone = "America/Lima";
1399
+ break;
1400
+ case "PF":
1401
+ $timezone = "Pacific/Marquesas";
1402
+ break;
1403
+ case "PG":
1404
+ $timezone = "Pacific/Port_Moresby";
1405
+ break;
1406
+ case "PH":
1407
+ $timezone = "Asia/Manila";
1408
+ break;
1409
+ case "PK":
1410
+ $timezone = "Asia/Karachi";
1411
+ break;
1412
+ case "PL":
1413
+ $timezone = "Europe/Warsaw";
1414
+ break;
1415
+ case "PM":
1416
+ $timezone = "America/Miquelon";
1417
+ break;
1418
+ case "PN":
1419
+ $timezone = "Pacific/Pitcairn";
1420
+ break;
1421
+ case "PR":
1422
+ $timezone = "America/Puerto_Rico";
1423
+ break;
1424
+ case "PS":
1425
+ $timezone = "Asia/Gaza";
1426
+ break;
1427
+ case "PT":
1428
+ switch ($region) {
1429
+ case "02":
1430
+ $timezone = "Europe/Lisbon";
1431
+ break;
1432
+ case "03":
1433
+ $timezone = "Europe/Lisbon";
1434
+ break;
1435
+ case "04":
1436
+ $timezone = "Europe/Lisbon";
1437
+ break;
1438
+ case "05":
1439
+ $timezone = "Europe/Lisbon";
1440
+ break;
1441
+ case "06":
1442
+ $timezone = "Europe/Lisbon";
1443
+ break;
1444
+ case "07":
1445
+ $timezone = "Europe/Lisbon";
1446
+ break;
1447
+ case "08":
1448
+ $timezone = "Europe/Lisbon";
1449
+ break;
1450
+ case "09":
1451
+ $timezone = "Europe/Lisbon";
1452
+ break;
1453
+ case "10":
1454
+ $timezone = "Atlantic/Madeira";
1455
+ break;
1456
+ case "11":
1457
+ $timezone = "Europe/Lisbon";
1458
+ break;
1459
+ case "13":
1460
+ $timezone = "Europe/Lisbon";
1461
+ break;
1462
+ case "14":
1463
+ $timezone = "Europe/Lisbon";
1464
+ break;
1465
+ case "16":
1466
+ $timezone = "Europe/Lisbon";
1467
+ break;
1468
+ case "17":
1469
+ $timezone = "Europe/Lisbon";
1470
+ break;
1471
+ case "18":
1472
+ $timezone = "Europe/Lisbon";
1473
+ break;
1474
+ case "19":
1475
+ $timezone = "Europe/Lisbon";
1476
+ break;
1477
+ case "20":
1478
+ $timezone = "Europe/Lisbon";
1479
+ break;
1480
+ case "21":
1481
+ $timezone = "Europe/Lisbon";
1482
+ break;
1483
+ case "22":
1484
+ $timezone = "Europe/Lisbon";
1485
+ break;
1486
+ case "23":
1487
+ $timezone = "Atlantic/Azores";
1488
+ break;
1489
+ }
1490
+ break;
1491
+ case "PW":
1492
+ $timezone = "Pacific/Palau";
1493
+ break;
1494
+ case "PY":
1495
+ $timezone = "America/Asuncion";
1496
+ break;
1497
+ case "QA":
1498
+ $timezone = "Asia/Qatar";
1499
+ break;
1500
+ case "RE":
1501
+ $timezone = "Indian/Reunion";
1502
+ break;
1503
+ case "RO":
1504
+ $timezone = "Europe/Bucharest";
1505
+ break;
1506
+ case "RS":
1507
+ $timezone = "Europe/Belgrade";
1508
+ break;
1509
+ case "RU":
1510
+ switch ($region) {
1511
+ case "01":
1512
+ $timezone = "Europe/Volgograd";
1513
+ break;
1514
+ case "02":
1515
+ $timezone = "Asia/Irkutsk";
1516
+ break;
1517
+ case "03":
1518
+ $timezone = "Asia/Novokuznetsk";
1519
+ break;
1520
+ case "04":
1521
+ $timezone = "Asia/Novosibirsk";
1522
+ break;
1523
+ case "05":
1524
+ $timezone = "Asia/Vladivostok";
1525
+ break;
1526
+ case "06":
1527
+ $timezone = "Europe/Moscow";
1528
+ break;
1529
+ case "07":
1530
+ $timezone = "Europe/Volgograd";
1531
+ break;
1532
+ case "08":
1533
+ $timezone = "Europe/Samara";
1534
+ break;
1535
+ case "09":
1536
+ $timezone = "Europe/Moscow";
1537
+ break;
1538
+ case "10":
1539
+ $timezone = "Europe/Moscow";
1540
+ break;
1541
+ case "11":
1542
+ $timezone = "Asia/Irkutsk";
1543
+ break;
1544
+ case "12":
1545
+ $timezone = "Europe/Volgograd";
1546
+ break;
1547
+ case "13":
1548
+ $timezone = "Asia/Yekaterinburg";
1549
+ break;
1550
+ case "14":
1551
+ $timezone = "Asia/Irkutsk";
1552
+ break;
1553
+ case "15":
1554
+ $timezone = "Asia/Anadyr";
1555
+ break;
1556
+ case "16":
1557
+ $timezone = "Europe/Samara";
1558
+ break;
1559
+ case "17":
1560
+ $timezone = "Europe/Volgograd";
1561
+ break;
1562
+ case "18":
1563
+ $timezone = "Asia/Krasnoyarsk";
1564
+ break;
1565
+ case "20":
1566
+ $timezone = "Asia/Irkutsk";
1567
+ break;
1568
+ case "21":
1569
+ $timezone = "Europe/Moscow";
1570
+ break;
1571
+ case "22":
1572
+ $timezone = "Europe/Volgograd";
1573
+ break;
1574
+ case "23":
1575
+ $timezone = "Europe/Kaliningrad";
1576
+ break;
1577
+ case "24":
1578
+ $timezone = "Europe/Volgograd";
1579
+ break;
1580
+ case "25":
1581
+ $timezone = "Europe/Moscow";
1582
+ break;
1583
+ case "26":
1584
+ $timezone = "Asia/Kamchatka";
1585
+ break;
1586
+ case "27":
1587
+ $timezone = "Europe/Volgograd";
1588
+ break;
1589
+ case "28":
1590
+ $timezone = "Europe/Moscow";
1591
+ break;
1592
+ case "29":
1593
+ $timezone = "Asia/Novokuznetsk";
1594
+ break;
1595
+ case "30":
1596
+ $timezone = "Asia/Vladivostok";
1597
+ break;
1598
+ case "31":
1599
+ $timezone = "Asia/Krasnoyarsk";
1600
+ break;
1601
+ case "32":
1602
+ $timezone = "Asia/Omsk";
1603
+ break;
1604
+ case "33":
1605
+ $timezone = "Asia/Yekaterinburg";
1606
+ break;
1607
+ case "34":
1608
+ $timezone = "Asia/Yekaterinburg";
1609
+ break;
1610
+ case "35":
1611
+ $timezone = "Asia/Yekaterinburg";
1612
+ break;
1613
+ case "36":
1614
+ $timezone = "Asia/Anadyr";
1615
+ break;
1616
+ case "37":
1617
+ $timezone = "Europe/Moscow";
1618
+ break;
1619
+ case "38":
1620
+ $timezone = "Europe/Volgograd";
1621
+ break;
1622
+ case "39":
1623
+ $timezone = "Asia/Krasnoyarsk";
1624
+ break;
1625
+ case "40":
1626
+ $timezone = "Asia/Yekaterinburg";
1627
+ break;
1628
+ case "41":
1629
+ $timezone = "Europe/Moscow";
1630
+ break;
1631
+ case "42":
1632
+ $timezone = "Europe/Moscow";
1633
+ break;
1634
+ case "43":
1635
+ $timezone = "Europe/Moscow";
1636
+ break;
1637
+ case "44":
1638
+ $timezone = "Asia/Magadan";
1639
+ break;
1640
+ case "45":
1641
+ $timezone = "Europe/Samara";
1642
+ break;
1643
+ case "46":
1644
+ $timezone = "Europe/Samara";
1645
+ break;
1646
+ case "47":
1647
+ $timezone = "Europe/Moscow";
1648
+ break;
1649
+ case "48":
1650
+ $timezone = "Europe/Moscow";
1651
+ break;
1652
+ case "49":
1653
+ $timezone = "Europe/Moscow";
1654
+ break;
1655
+ case "50":
1656
+ $timezone = "Asia/Yekaterinburg";
1657
+ break;
1658
+ case "51":
1659
+ $timezone = "Europe/Moscow";
1660
+ break;
1661
+ case "52":
1662
+ $timezone = "Europe/Moscow";
1663
+ break;
1664
+ case "53":
1665
+ $timezone = "Asia/Novosibirsk";
1666
+ break;
1667
+ case "54":
1668
+ $timezone = "Asia/Omsk";
1669
+ break;
1670
+ case "55":
1671
+ $timezone = "Europe/Samara";
1672
+ break;
1673
+ case "56":
1674
+ $timezone = "Europe/Moscow";
1675
+ break;
1676
+ case "57":
1677
+ $timezone = "Europe/Samara";
1678
+ break;
1679
+ case "58":
1680
+ $timezone = "Asia/Yekaterinburg";
1681
+ break;
1682
+ case "59":
1683
+ $timezone = "Asia/Vladivostok";
1684
+ break;
1685
+ case "60":
1686
+ $timezone = "Europe/Kaliningrad";
1687
+ break;
1688
+ case "61":
1689
+ $timezone = "Europe/Volgograd";
1690
+ break;
1691
+ case "62":
1692
+ $timezone = "Europe/Moscow";
1693
+ break;
1694
+ case "63":
1695
+ $timezone = "Asia/Yakutsk";
1696
+ break;
1697
+ case "64":
1698
+ $timezone = "Asia/Sakhalin";
1699
+ break;
1700
+ case "65":
1701
+ $timezone = "Europe/Samara";
1702
+ break;
1703
+ case "66":
1704
+ $timezone = "Europe/Moscow";
1705
+ break;
1706
+ case "67":
1707
+ $timezone = "Europe/Samara";
1708
+ break;
1709
+ case "68":
1710
+ $timezone = "Europe/Volgograd";
1711
+ break;
1712
+ case "69":
1713
+ $timezone = "Europe/Moscow";
1714
+ break;
1715
+ case "70":
1716
+ $timezone = "Europe/Volgograd";
1717
+ break;
1718
+ case "71":
1719
+ $timezone = "Asia/Yekaterinburg";
1720
+ break;
1721
+ case "72":
1722
+ $timezone = "Europe/Moscow";
1723
+ break;
1724
+ case "73":
1725
+ $timezone = "Europe/Samara";
1726
+ break;
1727
+ case "74":
1728
+ $timezone = "Asia/Krasnoyarsk";
1729
+ break;
1730
+ case "75":
1731
+ $timezone = "Asia/Novosibirsk";
1732
+ break;
1733
+ case "76":
1734
+ $timezone = "Europe/Moscow";
1735
+ break;
1736
+ case "77":
1737
+ $timezone = "Europe/Moscow";
1738
+ break;
1739
+ case "78":
1740
+ $timezone = "Asia/Yekaterinburg";
1741
+ break;
1742
+ case "79":
1743
+ $timezone = "Asia/Irkutsk";
1744
+ break;
1745
+ case "80":
1746
+ $timezone = "Asia/Yekaterinburg";
1747
+ break;
1748
+ case "81":
1749
+ $timezone = "Europe/Samara";
1750
+ break;
1751
+ case "82":
1752
+ $timezone = "Asia/Irkutsk";
1753
+ break;
1754
+ case "83":
1755
+ $timezone = "Europe/Moscow";
1756
+ break;
1757
+ case "84":
1758
+ $timezone = "Europe/Volgograd";
1759
+ break;
1760
+ case "85":
1761
+ $timezone = "Europe/Moscow";
1762
+ break;
1763
+ case "86":
1764
+ $timezone = "Europe/Moscow";
1765
+ break;
1766
+ case "87":
1767
+ $timezone = "Asia/Novosibirsk";
1768
+ break;
1769
+ case "88":
1770
+ $timezone = "Europe/Moscow";
1771
+ break;
1772
+ case "89":
1773
+ $timezone = "Asia/Vladivostok";
1774
+ break;
1775
+ case "90":
1776
+ $timezone = "Asia/Yekaterinburg";
1777
+ break;
1778
+ case "91":
1779
+ $timezone = "Asia/Krasnoyarsk";
1780
+ break;
1781
+ case "92":
1782
+ $timezone = "Asia/Anadyr";
1783
+ break;
1784
+ case "93":
1785
+ $timezone = "Asia/Irkutsk";
1786
+ break;
1787
+ }
1788
+ break;
1789
+ case "RW":
1790
+ $timezone = "Africa/Kigali";
1791
+ break;
1792
+ case "SA":
1793
+ $timezone = "Asia/Riyadh";
1794
+ break;
1795
+ case "SB":
1796
+ $timezone = "Pacific/Guadalcanal";
1797
+ break;
1798
+ case "SC":
1799
+ $timezone = "Indian/Mahe";
1800
+ break;
1801
+ case "SD":
1802
+ $timezone = "Africa/Khartoum";
1803
+ break;
1804
+ case "SE":
1805
+ $timezone = "Europe/Stockholm";
1806
+ break;
1807
+ case "SG":
1808
+ $timezone = "Asia/Singapore";
1809
+ break;
1810
+ case "SH":
1811
+ $timezone = "Atlantic/St_Helena";
1812
+ break;
1813
+ case "SI":
1814
+ $timezone = "Europe/Ljubljana";
1815
+ break;
1816
+ case "SJ":
1817
+ $timezone = "Arctic/Longyearbyen";
1818
+ break;
1819
+ case "SK":
1820
+ $timezone = "Europe/Bratislava";
1821
+ break;
1822
+ case "SL":
1823
+ $timezone = "Africa/Freetown";
1824
+ break;
1825
+ case "SM":
1826
+ $timezone = "Europe/San_Marino";
1827
+ break;
1828
+ case "SN":
1829
+ $timezone = "Africa/Dakar";
1830
+ break;
1831
+ case "SO":
1832
+ $timezone = "Africa/Mogadishu";
1833
+ break;
1834
+ case "SR":
1835
+ $timezone = "America/Paramaribo";
1836
+ break;
1837
+ case "SS":
1838
+ $timezone = "Africa/Juba";
1839
+ break;
1840
+ case "ST":
1841
+ $timezone = "Africa/Sao_Tome";
1842
+ break;
1843
+ case "SV":
1844
+ $timezone = "America/El_Salvador";
1845
+ break;
1846
+ case "SX":
1847
+ $timezone = "America/Curacao";
1848
+ break;
1849
+ case "SY":
1850
+ $timezone = "Asia/Damascus";
1851
+ break;
1852
+ case "SZ":
1853
+ $timezone = "Africa/Mbabane";
1854
+ break;
1855
+ case "TC":
1856
+ $timezone = "America/Grand_Turk";
1857
+ break;
1858
+ case "TD":
1859
+ $timezone = "Africa/Ndjamena";
1860
+ break;
1861
+ case "TF":
1862
+ $timezone = "Indian/Kerguelen";
1863
+ break;
1864
+ case "TG":
1865
+ $timezone = "Africa/Lome";
1866
+ break;
1867
+ case "TH":
1868
+ $timezone = "Asia/Bangkok";
1869
+ break;
1870
+ case "TJ":
1871
+ $timezone = "Asia/Dushanbe";
1872
+ break;
1873
+ case "TK":
1874
+ $timezone = "Pacific/Fakaofo";
1875
+ break;
1876
+ case "TL":
1877
+ $timezone = "Asia/Dili";
1878
+ break;
1879
+ case "TM":
1880
+ $timezone = "Asia/Ashgabat";
1881
+ break;
1882
+ case "TN":
1883
+ $timezone = "Africa/Tunis";
1884
+ break;
1885
+ case "TO":
1886
+ $timezone = "Pacific/Tongatapu";
1887
+ break;
1888
+ case "TR":
1889
+ $timezone = "Asia/Istanbul";
1890
+ break;
1891
+ case "TT":
1892
+ $timezone = "America/Port_of_Spain";
1893
+ break;
1894
+ case "TV":
1895
+ $timezone = "Pacific/Funafuti";
1896
+ break;
1897
+ case "TW":
1898
+ $timezone = "Asia/Taipei";
1899
+ break;
1900
+ case "TZ":
1901
+ $timezone = "Africa/Dar_es_Salaam";
1902
+ break;
1903
+ case "UA":
1904
+ switch ($region) {
1905
+ case "01":
1906
+ $timezone = "Europe/Kiev";
1907
+ break;
1908
+ case "02":
1909
+ $timezone = "Europe/Kiev";
1910
+ break;
1911
+ case "03":
1912
+ $timezone = "Europe/Uzhgorod";
1913
+ break;
1914
+ case "04":
1915
+ $timezone = "Europe/Zaporozhye";
1916
+ break;
1917
+ case "05":
1918
+ $timezone = "Europe/Zaporozhye";
1919
+ break;
1920
+ case "06":
1921
+ $timezone = "Europe/Uzhgorod";
1922
+ break;
1923
+ case "07":
1924
+ $timezone = "Europe/Zaporozhye";
1925
+ break;
1926
+ case "08":
1927
+ $timezone = "Europe/Simferopol";
1928
+ break;
1929
+ case "09":
1930
+ $timezone = "Europe/Kiev";
1931
+ break;
1932
+ case "10":
1933
+ $timezone = "Europe/Zaporozhye";
1934
+ break;
1935
+ case "11":
1936
+ $timezone = "Europe/Simferopol";
1937
+ break;
1938
+ case "12":
1939
+ $timezone = "Europe/Kiev";
1940
+ break;
1941
+ case "13":
1942
+ $timezone = "Europe/Kiev";
1943
+ break;
1944
+ case "14":
1945
+ $timezone = "Europe/Zaporozhye";
1946
+ break;
1947
+ case "15":
1948
+ $timezone = "Europe/Uzhgorod";
1949
+ break;
1950
+ case "16":
1951
+ $timezone = "Europe/Zaporozhye";
1952
+ break;
1953
+ case "17":
1954
+ $timezone = "Europe/Simferopol";
1955
+ break;
1956
+ case "18":
1957
+ $timezone = "Europe/Zaporozhye";
1958
+ break;
1959
+ case "19":
1960
+ $timezone = "Europe/Kiev";
1961
+ break;
1962
+ case "20":
1963
+ $timezone = "Europe/Simferopol";
1964
+ break;
1965
+ case "21":
1966
+ $timezone = "Europe/Kiev";
1967
+ break;
1968
+ case "22":
1969
+ $timezone = "Europe/Uzhgorod";
1970
+ break;
1971
+ case "23":
1972
+ $timezone = "Europe/Kiev";
1973
+ break;
1974
+ case "24":
1975
+ $timezone = "Europe/Uzhgorod";
1976
+ break;
1977
+ case "25":
1978
+ $timezone = "Europe/Uzhgorod";
1979
+ break;
1980
+ case "26":
1981
+ $timezone = "Europe/Zaporozhye";
1982
+ break;
1983
+ case "27":
1984
+ $timezone = "Europe/Kiev";
1985
+ break;
1986
+ }
1987
+ break;
1988
+ case "UG":
1989
+ $timezone = "Africa/Kampala";
1990
+ break;
1991
+ case "UM":
1992
+ $timezone = "Pacific/Wake";
1993
+ break;
1994
+ case "US":
1995
+ switch ($region) {
1996
+ case "AK":
1997
+ $timezone = "America/Anchorage";
1998
+ break;
1999
+ case "AL":
2000
+ $timezone = "America/Chicago";
2001
+ break;
2002
+ case "AR":
2003
+ $timezone = "America/Chicago";
2004
+ break;
2005
+ case "AZ":
2006
+ $timezone = "America/Phoenix";
2007
+ break;
2008
+ case "CA":
2009
+ $timezone = "America/Los_Angeles";
2010
+ break;
2011
+ case "CO":
2012
+ $timezone = "America/Denver";
2013
+ break;
2014
+ case "CT":
2015
+ $timezone = "America/New_York";
2016
+ break;
2017
+ case "DC":
2018
+ $timezone = "America/New_York";
2019
+ break;
2020
+ case "DE":
2021
+ $timezone = "America/New_York";
2022
+ break;
2023
+ case "FL":
2024
+ $timezone = "America/New_York";
2025
+ break;
2026
+ case "GA":
2027
+ $timezone = "America/New_York";
2028
+ break;
2029
+ case "HI":
2030
+ $timezone = "Pacific/Honolulu";
2031
+ break;
2032
+ case "IA":
2033
+ $timezone = "America/Chicago";
2034
+ break;
2035
+ case "ID":
2036
+ $timezone = "America/Denver";
2037
+ break;
2038
+ case "IL":
2039
+ $timezone = "America/Chicago";
2040
+ break;
2041
+ case "IN":
2042
+ $timezone = "America/Indiana/Indianapolis";
2043
+ break;
2044
+ case "KS":
2045
+ $timezone = "America/Chicago";
2046
+ break;
2047
+ case "KY":
2048
+ $timezone = "America/New_York";
2049
+ break;
2050
+ case "LA":
2051
+ $timezone = "America/Chicago";
2052
+ break;
2053
+ case "MA":
2054
+ $timezone = "America/New_York";
2055
+ break;
2056
+ case "MD":
2057
+ $timezone = "America/New_York";
2058
+ break;
2059
+ case "ME":
2060
+ $timezone = "America/New_York";
2061
+ break;
2062
+ case "MI":
2063
+ $timezone = "America/New_York";
2064
+ break;
2065
+ case "MN":
2066
+ $timezone = "America/Chicago";
2067
+ break;
2068
+ case "MO":
2069
+ $timezone = "America/Chicago";
2070
+ break;
2071
+ case "MS":
2072
+ $timezone = "America/Chicago";
2073
+ break;
2074
+ case "MT":
2075
+ $timezone = "America/Denver";
2076
+ break;
2077
+ case "NC":
2078
+ $timezone = "America/New_York";
2079
+ break;
2080
+ case "ND":
2081
+ $timezone = "America/Chicago";
2082
+ break;
2083
+ case "NE":
2084
+ $timezone = "America/Chicago";
2085
+ break;
2086
+ case "NH":
2087
+ $timezone = "America/New_York";
2088
+ break;
2089
+ case "NJ":
2090
+ $timezone = "America/New_York";
2091
+ break;
2092
+ case "NM":
2093
+ $timezone = "America/Denver";
2094
+ break;
2095
+ case "NV":
2096
+ $timezone = "America/Los_Angeles";
2097
+ break;
2098
+ case "NY":
2099
+ $timezone = "America/New_York";
2100
+ break;
2101
+ case "OH":
2102
+ $timezone = "America/New_York";
2103
+ break;
2104
+ case "OK":
2105
+ $timezone = "America/Chicago";
2106
+ break;
2107
+ case "OR":
2108
+ $timezone = "America/Los_Angeles";
2109
+ break;
2110
+ case "PA":
2111
+ $timezone = "America/New_York";
2112
+ break;
2113
+ case "RI":
2114
+ $timezone = "America/New_York";
2115
+ break;
2116
+ case "SC":
2117
+ $timezone = "America/New_York";
2118
+ break;
2119
+ case "SD":
2120
+ $timezone = "America/Chicago";
2121
+ break;
2122
+ case "TN":
2123
+ $timezone = "America/Chicago";
2124
+ break;
2125
+ case "TX":
2126
+ $timezone = "America/Chicago";
2127
+ break;
2128
+ case "UT":
2129
+ $timezone = "America/Denver";
2130
+ break;
2131
+ case "VA":
2132
+ $timezone = "America/New_York";
2133
+ break;
2134
+ case "VT":
2135
+ $timezone = "America/New_York";
2136
+ break;
2137
+ case "WA":
2138
+ $timezone = "America/Los_Angeles";
2139
+ break;
2140
+ case "WI":
2141
+ $timezone = "America/Chicago";
2142
+ break;
2143
+ case "WV":
2144
+ $timezone = "America/New_York";
2145
+ break;
2146
+ case "WY":
2147
+ $timezone = "America/Denver";
2148
+ break;
2149
+ }
2150
+ break;
2151
+ case "UY":
2152
+ $timezone = "America/Montevideo";
2153
+ break;
2154
+ case "UZ":
2155
+ switch ($region) {
2156
+ case "01":
2157
+ $timezone = "Asia/Tashkent";
2158
+ break;
2159
+ case "02":
2160
+ $timezone = "Asia/Samarkand";
2161
+ break;
2162
+ case "03":
2163
+ $timezone = "Asia/Tashkent";
2164
+ break;
2165
+ case "05":
2166
+ $timezone = "Asia/Samarkand";
2167
+ break;
2168
+ case "06":
2169
+ $timezone = "Asia/Tashkent";
2170
+ break;
2171
+ case "07":
2172
+ $timezone = "Asia/Samarkand";
2173
+ break;
2174
+ case "08":
2175
+ $timezone = "Asia/Samarkand";
2176
+ break;
2177
+ case "09":
2178
+ $timezone = "Asia/Samarkand";
2179
+ break;
2180
+ case "10":
2181
+ $timezone = "Asia/Samarkand";
2182
+ break;
2183
+ case "12":
2184
+ $timezone = "Asia/Samarkand";
2185
+ break;
2186
+ case "13":
2187
+ $timezone = "Asia/Tashkent";
2188
+ break;
2189
+ case "14":
2190
+ $timezone = "Asia/Tashkent";
2191
+ break;
2192
+ }
2193
+ break;
2194
+ case "VA":
2195
+ $timezone = "Europe/Vatican";
2196
+ break;
2197
+ case "VC":
2198
+ $timezone = "America/St_Vincent";
2199
+ break;
2200
+ case "VE":
2201
+ $timezone = "America/Caracas";
2202
+ break;
2203
+ case "VG":
2204
+ $timezone = "America/Tortola";
2205
+ break;
2206
+ case "VI":
2207
+ $timezone = "America/St_Thomas";
2208
+ break;
2209
+ case "VN":
2210
+ $timezone = "Asia/Phnom_Penh";
2211
+ break;
2212
+ case "VU":
2213
+ $timezone = "Pacific/Efate";
2214
+ break;
2215
+ case "WF":
2216
+ $timezone = "Pacific/Wallis";
2217
+ break;
2218
+ case "WS":
2219
+ $timezone = "Pacific/Pago_Pago";
2220
+ break;
2221
+ case "YE":
2222
+ $timezone = "Asia/Aden";
2223
+ break;
2224
+ case "YT":
2225
+ $timezone = "Indian/Mayotte";
2226
+ break;
2227
+ case "YU":
2228
+ $timezone = "Europe/Belgrade";
2229
+ break;
2230
+ case "ZA":
2231
+ $timezone = "Africa/Johannesburg";
2232
+ break;
2233
+ case "ZM":
2234
+ $timezone = "Africa/Lusaka";
2235
+ break;
2236
+ case "ZW":
2237
+ $timezone = "Africa/Harare";
2238
+ break;
2239
+ }
2240
+ return $timezone;
2241
+ }
package.json CHANGED
@@ -8,21 +8,24 @@
8
  "license": "GPL-3.0-or-later",
9
  "scripts": {
10
  "clean": "rm -rf .cache",
11
- "build-lodash": "lodash include=get -o js/lodash.custom.js",
12
  "start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
13
- "build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url ."
 
14
  },
15
  "private": false,
16
  "dependencies": {
17
- "@babel/runtime": ">=7.7.2",
18
- "babel-plugin-transform-class-properties": "^6.24.1",
19
- "emoji-flags": "matiassingers/emoji-flags#master"
20
  },
21
  "devDependencies": {
22
- "@babel/core": ">=7.7.2",
23
  "@babel/plugin-transform-runtime": ">=7.6.2",
24
- "babel-plugin-transform-runtime": ">=6.23.0",
25
- "eslint": "^6.6.0",
 
 
 
26
  "lodash-cli": ">=4.17.5",
27
  "parcel-bundler": ">=1.12.4",
28
  "parcel-plugin-assets-list": ">=1.7.1"
8
  "license": "GPL-3.0-or-later",
9
  "scripts": {
10
  "clean": "rm -rf .cache",
11
+ "build-lodash": "lodash include=get,intersection -o js/lodash.custom.js",
12
  "start": "rm -rf js/dist && parcel parcel.urls --out-dir js/dist --public-url .",
13
+ "build": "rm -rf js/dist && parcel build parcel.urls --out-dir js/dist --public-url .",
14
+ "test": "jest"
15
  },
16
  "private": false,
17
  "dependencies": {
18
+ "@babel/runtime": ">=7.12.0",
19
+ "emoji-flags": ">=1.3.0"
 
20
  },
21
  "devDependencies": {
22
+ "@babel/core": "^7.12.13",
23
  "@babel/plugin-transform-runtime": ">=7.6.2",
24
+ "@babel/preset-env": "^7.12.13",
25
+ "babel-jest": "^26.6.3",
26
+ "babel-plugin-transform-class-properties": "^6.24.1",
27
+ "eslint": "^7.19.0",
28
+ "jest": "^26.6.3",
29
  "lodash-cli": ">=4.17.5",
30
  "parcel-bundler": ">=1.12.4",
31
  "parcel-plugin-assets-list": ">=1.7.1"
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
  === Geolocation IP Detection ===
2
  Contributors: benjaminpick
3
  Tags: geolocation, locator, geoip, maxmind, ipstack
4
- Requires at least: 4.0
5
- Tested up to: 5.6
6
- Requires PHP: 5.6
7
  Stable tag: trunk
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
@@ -50,12 +50,14 @@ See [Documentation](https://github.com/yellowtree/geoip-detect/wiki) for more in
50
  * Be careful to comply to the applicable laws. For example Regulation (EU) 2018/302 (going into effect 03 Dec 2018)...
51
  * If you need to get the user's timezone, it is more accurate to use JS solutions.
52
 
53
- **System Requirements**: You will need at least PHP 5.6 (soon: PHP 7.2)
54
 
55
  *GDPR: See [Is this plugin GDPR-compliant?](https://github.com/yellowtree/geoip-detect/wiki/FAQ#is-this-plugin-gdpr-compliant)*
56
 
57
  *This extension is "charity-ware". If you are happy with it, please [leave a tip](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BSYUZHS8FH3CL) for the benefit of [this charity](http://www.jmem-hainichen.de/homepage). (See [FAQ](https://github.com/yellowtree/geoip-detect/wiki/FAQ#what-you-mean-by-this-plugin-is-charity-ware) for more infos.)*
58
 
 
 
59
  *This product can provide GeoLite2 data created by MaxMind, available from http://www.maxmind.com.*
60
 
61
  == Installation ==
@@ -115,25 +117,36 @@ Or maybe you are using a site cache plugin. Then enable the option `Disable cach
115
 
116
  == Upgrade Notice ==
117
 
 
 
 
 
 
118
  = 3.3.0 =
 
119
  Improving AJAX mode - now you can use it for specific pages.
120
 
121
  = 3.2.1 =
 
122
  This update fixes an issue of 3.2.0 if your installation has WP_DEBUG enabled.
123
 
124
  = 3.2.0 =
 
125
  This plugin version simplifies complying the the EULA of Maxmind by automatically retrieving and honoring their Privacy Exclusion List.
126
  You need to enter your Account ID in the options.
127
  Find more information about the Privacy Exclusion API in the FAQ of the plugin.
128
 
129
  = 3.1.0 =
 
130
  The property access for shortcodes has been rewritten so that property names such as "extra.original.zip" (Datasource: ipstack) are possible now.
131
 
132
  = 3.0.3.1 =
 
133
  Hotfix for the Manual download Maxmind datasource.
134
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
135
 
136
  = 3.0.3 =
 
137
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
138
 
139
  = 3.0.1 =
@@ -146,6 +159,32 @@ If you use Maxmind "Automatic download" then you need to upgrade to this plugin
146
 
147
  == Changelog ==
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  = 3.3.0 =
150
  * NEW shortcode `[geoip_detect2_enqueue_javascript]` if you are using AJAX mode, but only on certain wordpress pages.
151
  * NEW option "Add a country-specific CSS class to the <body>-Tag (via AJAX)." It is enabled automatically when upgrading the plugin, if the options "AJAX" and the "body tag" was enabled before.
1
  === Geolocation IP Detection ===
2
  Contributors: benjaminpick
3
  Tags: geolocation, locator, geoip, maxmind, ipstack
4
+ Requires at least: 5.0
5
+ Tested up to: 5.7
6
+ Requires PHP: 7.2
7
  Stable tag: trunk
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
50
  * Be careful to comply to the applicable laws. For example Regulation (EU) 2018/302 (going into effect 03 Dec 2018)...
51
  * If you need to get the user's timezone, it is more accurate to use JS solutions.
52
 
53
+ **System Requirements**: You will need at least PHP 7.2. If you use the plugin WooCommerce, you'll need at least WooCommerce 3.9.0 .
54
 
55
  *GDPR: See [Is this plugin GDPR-compliant?](https://github.com/yellowtree/geoip-detect/wiki/FAQ#is-this-plugin-gdpr-compliant)*
56
 
57
  *This extension is "charity-ware". If you are happy with it, please [leave a tip](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BSYUZHS8FH3CL) for the benefit of [this charity](http://www.jmem-hainichen.de/homepage). (See [FAQ](https://github.com/yellowtree/geoip-detect/wiki/FAQ#what-you-mean-by-this-plugin-is-charity-ware) for more infos.)*
58
 
59
+ *[Here are other ways to contribute to the development of this plugin.](https://github.com/yellowtree/geoip-detect/blob/master/CONTRIBUTING.md)
60
+
61
  *This product can provide GeoLite2 data created by MaxMind, available from http://www.maxmind.com.*
62
 
63
  == Installation ==
117
 
118
  == Upgrade Notice ==
119
 
120
+ = 4.0.0 =
121
+
122
+ Improving Shortcodes (and Shortcodes for AJAX!)
123
+ New Minimum Requirements: PHP 7.2.5, and if you use WooCommerce it needs to be 3.9.0 or later.
124
+
125
  = 3.3.0 =
126
+
127
  Improving AJAX mode - now you can use it for specific pages.
128
 
129
  = 3.2.1 =
130
+
131
  This update fixes an issue of 3.2.0 if your installation has WP_DEBUG enabled.
132
 
133
  = 3.2.0 =
134
+
135
  This plugin version simplifies complying the the EULA of Maxmind by automatically retrieving and honoring their Privacy Exclusion List.
136
  You need to enter your Account ID in the options.
137
  Find more information about the Privacy Exclusion API in the FAQ of the plugin.
138
 
139
  = 3.1.0 =
140
+
141
  The property access for shortcodes has been rewritten so that property names such as "extra.original.zip" (Datasource: ipstack) are possible now.
142
 
143
  = 3.0.3.1 =
144
+
145
  Hotfix for the Manual download Maxmind datasource.
146
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
147
 
148
  = 3.0.3 =
149
+
150
  The Plugin was renamed to Geolocation IP Detection in order to prevent trademark issues.
151
 
152
  = 3.0.1 =
159
 
160
  == Changelog ==
161
 
162
+ = 4.0.0 =
163
+ This version has many changes regarding the Shortcodes API. It is a major version because it increases some system requirements (see below).
164
+
165
+ * NEW: Shortcodes can now also be resolved in AJAX mode (without coding JS).
166
+ If you are using a page cache, AJAX mode is the best solution for you. And thanks to shortcodes, this doesn't need custom coding anymore.
167
+ You can keep using the same shortcodes as before - just tick the options "Enable AJAX endpoint" and "Resolve shortcodes (via AJAX)".
168
+ Instead of doing the geo-lookup while generating the HTML, it will generate boilerplate HTML (for the cache) that will be filled by the plugin's JS automatically (in the client's browser).
169
+ * NEW: JS has a new function called `set_override(record, duration_in_days)` (see [AJAX documentation](https://github.com/yellowtree/geoip-detect/wiki/API:-AJAX)) so that the record information can be overridden manually (e.g. when the user selects a certain country manually). A PHP equivalent will follow.
170
+ * NEW: The JS syntax of the shortcodes now supports both underscore_case and camelCase (e.g. both country.is_in_european_union and country.isInEuropeanUnion are valid)
171
+ * NEW: [geoip_detect2_show_if] and [geoip_detect2_hide_if] now have a new attribute `operator="OR"` - this can be used to create conditions such as "continent = EU OR country = US"
172
+
173
+ Other Improvements:
174
+ * NEW (UI): Add a "Empty Cache"-Button on the Lookup page if the data source is caching the results
175
+ * FIX: In some cases, the Privacy Exclusions Update wasn't rescheduled properly before
176
+ * FIX: Ipstack: The property country.isInEuropeanUnion is now filled properly.
177
+ * Updated vendor code
178
+
179
+ Also note:
180
+ * The minimum PHP version is now 7.2.5
181
+ * Minimum Wordpress version is now 5.0
182
+ * The plugin is now using PHP Type-Hinting for API functions - if you used the PHP API, please check if you see PHP errors
183
+ * If you are using WooCommerce, you need at least version 3.9.0 (released Jan 2020) - otherwise this plugin lookup disables itself
184
+
185
+ As always, if you are happy about the plugin, please consider [donating](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BSYUZHS8FH3CL), [becoming a Beta-Tester](https://github.com/yellowtree/geoip-detect/wiki/Beta_Testing) or otherwise [contributing](https://github.com/yellowtree/geoip-detect/blob/master/CONTRIBUTING.md) to it.
186
+
187
+
188
  = 3.3.0 =
189
  * NEW shortcode `[geoip_detect2_enqueue_javascript]` if you are using AJAX mode, but only on certain wordpress pages.
190
  * NEW option "Add a country-specific CSS class to the <body>-Tag (via AJAX)." It is enabled automatically when upgrading the plugin, if the options "AJAX" and the "body tag" was enabled before.
shortcodes/_helpers.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+
22
+ /**
23
+ * Prepare the options
24
+ */
25
+ function _geoip_detect2_shortcode_options($attr) {
26
+ $locales = isset($attr['lang']) ? $attr['lang'] . ',en' : null;
27
+ $locales = apply_filters('geoip_detect2_locales', $locales);
28
+
29
+ $opt = [
30
+ 'skip_cache' => isset($attr['skip_cache']) ? filter_var($attr['skip_cache'], FILTER_VALIDATE_BOOLEAN ) : false,
31
+ 'lang' => $locales,
32
+ 'default' => isset($attr['default']) ? $attr['default'] : '',
33
+ ];
34
+ if (isset($attr['property'])) {
35
+ $opt['property'] = $attr['property'];
36
+ }
37
+ return $opt;
38
+ }
39
+
40
+
41
+ function _geoip_detect_flatten_html_attr($attr) {
42
+ $html = '';
43
+ foreach ($attr as $key => $value) {
44
+ if ($value)
45
+ $html .= $key . '="' . esc_attr($value) . '" ';
46
+ }
47
+ return $html;
48
+ }
49
+
50
+
51
+ // ----------------------- AJAX support --------------------------------
52
+
53
+ /**
54
+ * Shortcodes can be executed on the server or via AJAX. Which mode should be used?
55
+ *
56
+ * If the shortcode has a property called "ajax", then use that.
57
+ * Otherwise check if AJAX is enabled globally, and the use of shortcodes as well.
58
+ */
59
+ function geoip_detect2_shortcode_is_ajax_mode($attr) {
60
+ if (isset($attr['ajax'])) {
61
+ $value = filter_var($attr['ajax'], FILTER_VALIDATE_BOOLEAN );
62
+ return $value;
63
+ }
64
+
65
+ if (get_option('geoip-detect-ajax_enabled') && get_option('geoip-detect-ajax_shortcodes')) {
66
+ return true;
67
+ }
68
+ return false;
69
+ }
70
+
71
+
72
+ function _geoip_detect2_create_placeholder($tag = "span", $attr = [], $data = null, $innerHTML = '') {
73
+ $tag = sanitize_key($tag);
74
+ $html = "<$tag";
75
+
76
+ if ($data) {
77
+ $attr['data-options'] = wp_json_encode($data);
78
+ }
79
+ if ($attr) {
80
+ $html .= ' ' . _geoip_detect_flatten_html_attr($attr);
81
+ }
82
+ $html .= ">$innerHTML</$tag>";
83
+
84
+ return $html;
85
+ }
shortcodes/cf7.php ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+
5
+ add_action( 'wpcf7_init', 'geoip_detect2_add_wpcf7_shortcodes' );
6
+ function geoip_detect2_add_wpcf7_shortcodes() {
7
+ if (function_exists('wpcf7_add_form_tag')) {
8
+ // >=CF 4.6
9
+ wpcf7_add_form_tag(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
10
+ wpcf7_add_form_tag(array('geoip_detect2_text_input', 'geoip_detect2_text_input*'), 'geoip_detect2_shortcode_text_input_wpcf7', true);
11
+ } else if (function_exists('wpcf7_add_shortcode')) {
12
+ // < CF 4.6
13
+ wpcf7_add_shortcode(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
14
+ wpcf7_add_shortcode(array('geoip_detect2_text_input', 'geoip_detect2_text_input*'), 'geoip_detect2_shortcode_text_input_wpcf7', true);
15
+ }
16
+ }
17
+
18
+
19
+ /**
20
+ * Generating a country select field that has the geoip value as default
21
+ *
22
+ * Examples:
23
+ *
24
+ * `[geoip_detect2_countries mycountry id:id class:class lang:fr]`
25
+ * A list of all country names in French (with CSS id "#id" and class ".class"), the visitor's country is preselected.
26
+ *
27
+ * `[geoip_detect2_countries mycountry include_blank]`
28
+ * Country names are in the current site language. User can also choose '---' for no country at all.
29
+ *
30
+ * `[geoip_detect2_countries mycountry flag tel]`
31
+ * Country names have a UTF-8 flag in front of the country name, and the (+1) internation phone code after it
32
+ *
33
+ * `[geoip_detect2_countries mycountry "US"]`
34
+ * "United States" is preselected, there is no visitor IP detection going on here
35
+ *
36
+ * `[geoip_detect2_countries mycountry default:US]`
37
+ * Visitor's country is preselected, but in case the country is unknown, use "United States"
38
+ *
39
+ */
40
+ function geoip_detect2_shortcode_country_select_wpcf7($tag) {
41
+ $tag = new WPCF7_FormTag( $tag );
42
+
43
+ $default = (string) reset( $tag->values );
44
+ $default = $tag->get_default_option($default, array('multiple' => false));
45
+ $default = wpcf7_get_hangover( $tag->name, $default ); // Get from $_POST if available
46
+
47
+ $class = wpcf7_form_controls_class( $tag->type );
48
+ $validation_error = wpcf7_get_validation_error( $tag->name );
49
+ if ($validation_error)
50
+ $class .= ' wpcf7-not-valid';
51
+
52
+ $attr = array(
53
+ 'name' => $tag->name,
54
+ 'include_blank' => $tag->has_option( 'include_blank' ),
55
+ 'required' => substr($tag->type, -1) == '*',
56
+ 'invalid' => $validation_error ? 'true' : 'false',
57
+ 'id' => $tag->get_id_option(),
58
+ 'class' => $tag->get_class_option( $class ),
59
+ 'lang' => $tag->get_option('lang', '', true),
60
+ 'selected' => $default,
61
+ 'default' => $tag->get_option('default', '', true),
62
+ 'flag' => $tag->has_option('flag'),
63
+ 'tel' => $tag->has_option('tel'),
64
+ );
65
+
66
+ $html = geoip_detect2_shortcode_country_select($attr);
67
+
68
+ $html = sprintf(
69
+ '<span class="wpcf7-form-control-wrap %1$s">%2$s %3$s</span>',
70
+ sanitize_html_class( $tag->name ), $html, $validation_error );
71
+
72
+ return $html;
73
+ }
74
+
75
+
76
+ /**
77
+ * Generating a text field that has a geoip value as default
78
+ *
79
+ * Property can be: continent, country, city, postal.code or any other property understood by `geoip_detect2_get_info_from_ip`
80
+ *
81
+ * Examples:
82
+ *
83
+ * `[geoip_detect2_text_input city property:city lang:fr id:id class:class]`
84
+ * A text input that has the detetected city as default (with CSS id "#id" and class ".class")
85
+ *
86
+ * `[geoip_detect2_text_input city property:city lang:fr id:id class:class default:Paris]`
87
+ * As above, but in case the city is unknown, use "Paris"
88
+ *
89
+ * `[geoip_detect2_text_input postal property:postal.code type:hidden]`
90
+ * An invisible text input containing the postal code.
91
+ *
92
+ */
93
+ function geoip_detect2_shortcode_text_input_wpcf7($tag) {
94
+ $tag = new WPCF7_FormTag( $tag );
95
+
96
+ $default = (string) reset( $tag->values );
97
+ $default = $tag->get_default_option($default, array('multiple' => false));
98
+ $default = wpcf7_get_hangover( $tag->name, $default ); // Get from $_POST if available
99
+
100
+ $class = wpcf7_form_controls_class( $tag->type );
101
+ $validation_error = wpcf7_get_validation_error( $tag->name );
102
+ if ($validation_error)
103
+ $class .= ' wpcf7-not-valid';
104
+
105
+ $attr = array(
106
+ 'name' => $tag->name,
107
+ 'required' => substr($tag->type, -1) == '*',
108
+ 'invalid' => $validation_error ? 'true' : 'false',
109
+ 'id' => $tag->get_id_option(),
110
+ 'class' => $tag->get_class_option( $class ),
111
+ 'type' => $tag->get_option('type', '', true),
112
+ 'lang' => $tag->get_option('lang', '', true),
113
+ 'property' => $tag->get_option('property', '', true),
114
+ 'default' => $tag->get_option('default', '', true),
115
+ );
116
+ $html = geoip_detect2_shortcode_text_input($attr);
117
+
118
+ $html = sprintf(
119
+ '<span class="wpcf7-form-control-wrap %1$s">%2$s %3$s</span>',
120
+ sanitize_html_class( $tag->name ), $html, $validation_error );
121
+
122
+ return $html;
123
+ }
124
+
125
+ function geoip_detect2_shortcode_user_info_wpcf7($output, $name, $isHtml) {
126
+ $lines = array();
127
+
128
+ switch($name) {
129
+ case 'geoip_detect2_get_client_ip':
130
+ $lines[] = geoip_detect2_get_client_ip();
131
+ break;
132
+ case 'geoip_detect2_get_current_source_description':
133
+ $lines[] = geoip_detect2_get_current_source_description();
134
+ break;
135
+ case 'geoip_detect2_property_country':
136
+ $info = geoip_detect2_get_info_from_current_ip();
137
+ $lines[] = $info->country->name;
138
+ break;
139
+ case 'geoip_detect2_property_most_specific_subdivision':
140
+ case 'geoip_detect2_property_state':
141
+ case 'geoip_detect2_property_region':
142
+ $name = 'geoip_detect2_property_most_specific_subdivision';
143
+ $info = geoip_detect2_get_info_from_current_ip();
144
+ $lines[] = $info->mostSpecificSubdivision->name;
145
+ break;
146
+ case 'geoip_detect2_property_city':
147
+ $info = geoip_detect2_get_info_from_current_ip();
148
+ $lines[] = $info->city->name;
149
+ break;
150
+
151
+ case 'geoip_detect2_user_info':
152
+ $lines[] = sprintf(__('IP of the user: %s', 'geoip-detect'), geoip_detect2_get_client_ip());
153
+
154
+ $info = geoip_detect2_get_info_from_current_ip();
155
+ if ($info->country->name)
156
+ $lines[] = sprintf(__('Country: %s', 'geoip-detect'), $info->country->name);
157
+ if ($info->mostSpecificSubdivision->name)
158
+ $lines[] = sprintf(__('State or region: %s', 'geoip-detect'), $info->mostSpecificSubdivision->name);
159
+ if ($info->city->name)
160
+ $lines[] = sprintf(__('City: %s', 'geoip-detect'), $info->city->name);
161
+
162
+ $lines[] = '';
163
+ $lines[] = sprintf(__('Data from: %s', 'geoip-detect'), geoip_detect2_get_current_source_description());
164
+ break;
165
+
166
+ default:
167
+ return $output;
168
+ }
169
+
170
+ /**
171
+ * Filter: geoip2_detect_wpcf7_special_mail_tags
172
+ * This filter is called if a GeoIP-detection-tag was used.
173
+ *
174
+ * @param array $lines - Output lines
175
+ * @param string $name - Name of the WPCF 7 Tag that was used
176
+ * @param bool $isHtml - Whether HTML or Plain Text output should be used
177
+ * @return array Output lines
178
+ */
179
+ $lines = apply_filters('geoip2_detect_wpcf7_special_mail_tags', $lines, $name, $isHtml);
180
+
181
+ $lineBreak = $isHtml ? "<br>" : "\n";
182
+ return implode($lineBreak, $lines);
183
+ }
184
+ add_filter( 'wpcf7_special_mail_tags', 'geoip_detect2_shortcode_user_info_wpcf7', 18, 3 );
shortcodes/flags.php ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ // This needs the Plugin "SVG Flags" to work!
22
+
23
+ /**
24
+ * Simple use:
25
+ *
26
+ * [geoip_detect2_current_flag]
27
+ *
28
+ * All possible parameters:
29
+ *
30
+ * [geoip_detect2_current_flag height="10% !important", width="30" class="extra-flag-class" squared="0" default="it" ajax="0"]
31
+ *
32
+ * @param int|string width CSS Width of the flag `<span>`-Element (in Pixels or CSS including unit)
33
+ * @param int|string height CSS Height of the flag `<span>`-Element (in Pixels or CSS including unit)
34
+ * @param int squared Instead of being 4:3, the flag should be 1:1 in ratio
35
+ * @param string $class Extra CSS Class of element. All flags will have the class `flag-icon` anyway.
36
+ * @param string $default Default Country in case the visitor's country cannot be determined
37
+ */
38
+ function geoip_detect2_shortcode_current_flag($orig_attr, $content = '', $shortcodeName = 'geoip_detect2_current_flag') {
39
+ if (!shortcode_exists('svg-flag') && !defined('GEOIP_DETECT_DOING_UNIT_TESTS')) {
40
+ return '<!-- There should be a flag here. However, the Plugin "SVG Flags" is missing.';
41
+ }
42
+
43
+ $attr = shortcode_atts(array(
44
+ 'width' => '',
45
+ 'height' => '',
46
+ 'squared' => '',
47
+ 'square' => '',
48
+ 'class' => '',
49
+ 'default' => '',
50
+ 'skip_cache' => false,
51
+ 'ajax' => false,
52
+ ), $orig_attr, $shortcodeName);
53
+
54
+ $skipCache = filter_var($attr['skip_cache'], FILTER_VALIDATE_BOOLEAN );
55
+ $options = array('skipCache' => $skipCache);
56
+
57
+ $style = '';
58
+ $processCssProperty = function($name, $value) {
59
+ $value = strtr($value, [' ' => '', ':' => '', ';' => '']);
60
+ if (!$value) {
61
+ return '';
62
+ }
63
+ if (is_numeric($value)) {
64
+ $value .= 'px';
65
+ }
66
+ return $name . ':' . $value . ';';
67
+ };
68
+ $style .= $processCssProperty('height', $attr['height']);
69
+ $style .= $processCssProperty('width', $attr['width']);
70
+
71
+ if ($attr['squared'] || $attr['square']) {
72
+ $attr['class'] .= ' flag-icon-squared';
73
+ }
74
+
75
+ $attr['class'] .= ' flag-icon';
76
+
77
+ $options = [];
78
+ if (geoip_detect2_shortcode_is_ajax_mode($orig_attr)) {
79
+ geoip_detect2_enqueue_javascript('shortcode');
80
+ $attr['class'] .= ' js-geoip-detect-flag';
81
+ $options['default'] = $attr['default'];
82
+ } else {
83
+ $record = geoip_detect2_get_info_from_current_ip(null, $options);
84
+ $country = $attr['default'];
85
+ if ($record->country->isoCode) {
86
+ $country = $record->country->isoCode;
87
+ }
88
+ if (!$country) {
89
+ return '<!-- There should be a flag here, but no country could be detected and the parameter "default" was not set. -->';
90
+ }
91
+ $country = mb_substr($country, 0, 2);
92
+ $country = mb_strtolower($country);
93
+
94
+ $attr['class'] .= ' flag-icon-' . $country;
95
+ }
96
+
97
+ return _geoip_detect2_create_placeholder('span', [
98
+ 'style' => $style,
99
+ 'class' => $attr['class'],
100
+ ], $options);
101
+ }
102
+ add_shortcode('geoip_detect2_current_flag', 'geoip_detect2_shortcode_current_flag');
shortcodes/input.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+
22
+ /**
23
+ * Generating an <input />-field that has a geoip value as default
24
+ *
25
+ * Property can be: continent, country, city, postal.code or any other property understood by `geoip_detect2_get_info_from_ip`
26
+ *
27
+ * Examples:
28
+ *
29
+ * `[geoip_detect2_text_input name="city" property="city" lang="fr" id="id" class="class"]`
30
+ * A text input that has the detetected city as default (with CSS id "#id" and class ".class")
31
+ *
32
+ * `[geoip_detect2_text_input name="city" property="city" lang="fr" id="id" class="class" default="Paris"]`
33
+ * As above, but in case the city is unknown, use "Paris"
34
+ *
35
+ * `[geoip_detect2_text_input name="postal" property="postal.code" type="hidden"]`
36
+ * An invisible text input containing the postal code.
37
+ *
38
+ * $attr is an array that can have these properties:
39
+ * @param string $property Maxmind property string (e.g. "city" or "postal.code")
40
+ * @param string $name Name of the form element
41
+ * @param bool $required If the field is required or not
42
+ * @param string $id CSS Id of element
43
+ * @param string $class CSS Class of element
44
+ * @param string $type HTML input type of element ("text" by default) (@since 3.1.2)
45
+ * @param string $lang Language(s) (optional. If not set, current site language is used.)
46
+ * @param string $default Default Value that will be used if country cannot be detected (optional)
47
+ * @param bool $skip_cache If 'true': Do not cache value (This parameter is ignored in AJAX mode)
48
+ * @param string $ip Lookup the data of a specific IP instead of the current client IP (this parameter does not work in AJAX mode)
49
+ * @param string $placeholder HZML attribute "plaecholer"
50
+ * @param bool $ajax 1: Execute this shortcode as AJAX | 0: Execute this shortcode on the server | Unset: Use the global settings (execute as AJAX if both 'AJAX' and 'Resolve shortcodes (via Ajax)' are enabled)
51
+
52
+ *
53
+ * @return string The generated HTML
54
+ */
55
+ function geoip_detect2_shortcode_text_input($attr) {
56
+ $type = !empty($attr['type']) ? sanitize_key($attr['type']) : '';
57
+
58
+ $html_attrs = array(
59
+ 'name' => !empty($attr['name']) ? $attr['name'] : 'geoip-text-input',
60
+ 'id' => !empty($attr['id']) ? $attr['id'] : '',
61
+ 'class' => !empty($attr['class']) ? $attr['class'] : 'geoip-text-input',
62
+ 'type' => $type ? $type : 'text',
63
+ 'aria-required' => !empty($attr['required']) ? 'required' : '',
64
+ 'aria-invalid' => !empty($attr['invalid']) ? $attr['invalid'] : '',
65
+ 'placeholder' => !empty($attr['placeholder']) ? $attr['placeholder'] : '',
66
+ );
67
+
68
+ if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
69
+ geoip_detect2_enqueue_javascript('shortcode');
70
+ $html_attrs['class'] .= ' js-geoip-text-input';
71
+ $html_attrs['data-options'] = wp_json_encode(_geoip_detect2_shortcode_options($attr));
72
+ } else {
73
+ $html_attrs['value'] = geoip_detect2_shortcode($attr + array('add_error' => false));
74
+ }
75
+
76
+ $html = '<input ' . _geoip_detect_flatten_html_attr($html_attrs) . '/>';
77
+ return $html;
78
+ }
79
+ add_shortcode('geoip_detect2_text_input', 'geoip_detect2_shortcode_text_input');
80
+ add_shortcode('geoip_detect2_input', 'geoip_detect2_shortcode_text_input');
shortcodes/main.php ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ /**
22
+ * Short Code
23
+ *
24
+ * Examples:
25
+ * `[geoip_detect2 property="country"]` -> Germany
26
+ * `[geoip_detect2 property="country.isoCode"]` -> DE
27
+ * `[geoip_detect2 property="country.isoCode" ip="8.8.8.8"]` -> US
28
+ *
29
+ * `[geoip_detect2 property="country" lang="de"]` -> Deutschland
30
+ * `[geoip_detect2 property="country" lang="fr,de"]` -> Allemagne
31
+ * `[geoip_detect2 property="country.confidence" skip_cache="true" default="default value"]` -> default value
32
+ *
33
+ * @param string $property Property to read. For a list of all possible property names, see https://github.com/yellowtree/geoip-detect/wiki/Record-Properties#list-of-all-property-names
34
+ * @param string $lang Language(s) (optional. If not set, current site language is used.)
35
+ * @param string $default Default Value that will be shown if value not set (optional)
36
+ * @param bool $skip_cache If 'true': Do not cache value (This parameter is ignored in AJAX mode)
37
+ * @param string $ip Lookup the data of a specific IP instead of the current client IP (this parameter does not work in AJAX mode)
38
+ * @param bool $ajax 1: Execute this shortcode as AJAX | 0: Execute this shortcode on the server | Unset: Use the global settings (execute as AJAX if both 'AJAX' and 'Resolve shortcodes (via Ajax)' are enabled)
39
+ *
40
+ * @since 2.5.7 New attribute `ip`
41
+ */
42
+ function geoip_detect2_shortcode($orig_attr, $content = '', $shortcodeName = 'geoip_detect2')
43
+ {
44
+ $attr = shortcode_atts(array(
45
+ 'skip_cache' => 'false',
46
+ 'lang' => null,
47
+ 'default' => '',
48
+ 'property' => '',
49
+ 'ip' => null,
50
+ 'add_error' => true,
51
+ ), $orig_attr, $shortcodeName);
52
+
53
+ $shortcode_options = _geoip_detect2_shortcode_options($attr);
54
+
55
+
56
+ if (geoip_detect2_shortcode_is_ajax_mode($orig_attr) && !$attr['ip']) {
57
+ geoip_detect2_enqueue_javascript('shortcode');
58
+ return _geoip_detect2_create_placeholder('span', [ 'class' => 'js-geoip-detect-shortcode' ], $shortcode_options);
59
+ }
60
+
61
+ $options = array('skipCache' => $shortcode_options['skip_cache']);
62
+
63
+ $ip = $attr['ip'] ?: geoip_detect2_get_client_ip();
64
+
65
+ $userInfo = geoip_detect2_get_info_from_ip($ip, $shortcode_options['lang'], $options);
66
+
67
+ $defaultValue = esc_html($attr['default']);
68
+
69
+ if ($userInfo->isEmpty)
70
+ return $defaultValue . ($attr['add_error'] ? '<!-- Geolocation IP Detection: No information found for this IP (' . geoip_detect2_get_client_ip() . ') -->' : '');
71
+
72
+ try {
73
+ $return = geoip_detect2_shortcode_get_property($userInfo, $attr['property']);
74
+ } catch (\RuntimeException $e) {
75
+ return $defaultValue . ($attr['add_error'] ? '<!-- Geolocation IP Detection: Invalid property name. -->' : '');
76
+ }
77
+
78
+ if (is_object($return) && $return instanceof \GeoIp2\Record\AbstractPlaceRecord) {
79
+ $return = $return->name;
80
+ }
81
+
82
+ if (is_object($return) || is_array($return)) {
83
+ return $defaultValue . ($attr['add_error'] ? '<!-- Geolocation IP Detection: Invalid property name (sub-property missing). -->' : '');
84
+ }
85
+
86
+ if ($return)
87
+ return (string) $return;
88
+ else
89
+ return $defaultValue;
90
+
91
+ }
92
+ add_shortcode('geoip_detect2', 'geoip_detect2_shortcode');
93
+
94
+ /**
95
+ * Get property from object by string
96
+ * @param YellowTree\GeoipDetect\DataSources\City $userInfo GeoIP information object
97
+ * @param string $propertyName property name, e.g. "city.isoCode"
98
+ * @return string|\GeoIp2\Record\AbstractRecord Property Value
99
+ * @throws \RuntimeException (if Property name invalid)
100
+ */
101
+ function geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
102
+
103
+ $propertyAccessor = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessorBuilder()
104
+ ->enableExceptionOnInvalidIndex()
105
+ ->getPropertyAccessor();
106
+
107
+ if (_geoip_str_begins_with($propertyName, 'extra.original.')) {
108
+ $properties = explode('.', $propertyName);
109
+ $properties = array_slice($properties, 2);
110
+ $propertyName = 'extra.original[' . implode($properties, '][') . ']';
111
+ }
112
+
113
+ // subdivisions.0.isoCode -> subdivisions[0].isoCode
114
+ $propertyName = preg_replace('/\.([0-9])/', '[$1]', $propertyName);
115
+
116
+ try {
117
+ return $propertyAccessor->getValue($userInfo, $propertyName);
118
+ } catch(\Exception $e) {
119
+ throw new \RuntimeException('Invalid property name.');
120
+ }
121
+ }
shortcodes/other.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ /**
22
+ * Get the client ip
23
+ * IPv4 or IPv6-Adress of the client. This takes reverse proxies into account, if they are configured on the options page.
24
+ *
25
+ * [geoip_detect2_get_client_ip]
26
+ *
27
+ * @param bool $ajax 1: Execute this shortcode as AJAX | 0: Execute this shortcode on the server | Unset: Use the global settings (execute as AJAX if both 'AJAX' and 'Resolve shortcodes (via Ajax)' are enabled)
28
+ *
29
+ * @since 2.5.2
30
+ */
31
+ function geoip_detect2_shortcode_client_ip($attr) {
32
+ if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
33
+ return geoip_detect2_shortcode([
34
+ 'property' => 'traits.ipAddress',
35
+ 'ajax' => isset($attr['ajax']) ? $attr['ajax'] : null,
36
+ ]);
37
+ } else {
38
+ $client_ip = geoip_detect2_get_client_ip();
39
+ $client_ip = geoip_detect_normalize_ip($client_ip);
40
+
41
+ return $client_ip;
42
+ }
43
+ }
44
+ add_shortcode('geoip_detect2_get_client_ip', 'geoip_detect2_shortcode_client_ip');
45
+
46
+ function geoip_detect2_shortcode_get_external_ip_adress($attr) {
47
+ $external_ip = geoip_detect2_get_external_ip_adress();
48
+ $external_ip = geoip_detect_normalize_ip($external_ip);
49
+
50
+ return $external_ip;
51
+ }
52
+ add_shortcode('geoip_detect2_get_external_ip_adress', 'geoip_detect2_shortcode_get_external_ip_adress');
53
+
54
+ function geoip_detect2_shortcode_get_current_source_description() {
55
+ $return = geoip_detect2_get_current_source_description();
56
+
57
+ return $return;
58
+ }
59
+ add_shortcode('geoip_detect2_get_current_source_description', 'geoip_detect2_shortcode_get_current_source_description');
60
+
61
+
62
+ /**
63
+ * Just in case somebody really wants to use this shortcode outside of cf7
64
+ */
65
+ function geoip_detect_shortcode_user_info() {
66
+ return geoip_detect2_shortcode_user_info_wpcf7('', 'geoip_detect2_user_info', true);
67
+ }
68
+ add_shortcode('geoip_detect2_user_info', 'geoip_detect_shortcode_user_info');
69
+
70
+ function geoip_detect2_shortcode_enqueue_javascript() {
71
+ geoip_detect2_enqueue_javascript('user_shortcode');
72
+ return '';
73
+ }
74
+ add_shortcode('geoip_detect2_enqueue_javascript', 'geoip_detect2_shortcode_enqueue_javascript');
shortcodes/select.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2013-2021 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
+
6
+ This program is free software; you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation; either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+
22
+
23
+
24
+
25
+
26
+ /**
27
+ * Create a <select>-Input element with all countries.
28
+ *
29
+ * Examples:
30
+ * `[geoip_detect2_countries_select name="mycountry" lang="fr"]`
31
+ * A list of all country names in French, the visitor's country is preselected.
32
+ *
33
+ * `[geoip_detect2_countries_select id="id" class="class" name="mycountry" lang="fr"]`
34
+ * As above, with CSS id "#id" and class ".class"
35
+ *
36
+ * `[geoip_detect2_countries_select name="mycountry" include_blank="true"]`
37
+ * Country names are in the current site language. User can also choose '---' for no country at all.
38
+ *
39
+ * `[geoip_detect2_countries_select name="mycountry" selected="US"]`
40
+ * "United States" is preselected, there is no visitor IP detection going on here
41
+ *
42
+ * `[geoip_detect2_countries_select name="mycountry" default="US"]`
43
+ * Visitor's country is preselected, but in case the country is unknown, use "United States"
44
+ *
45
+ * $attr is an array that can have these properties:
46
+ * @param string $name Name of the form element
47
+ * @param string $id CSS Id of element
48
+ * @param bool $required If the field is required or not
49
+ * @param string $class CSS Class of element
50
+ * @param string $lang Language(s) (optional. If not set, current site language is used.)
51
+ * @param string $selected Which country to select by default (2-letter ISO code.) (optional. If not set, the country will be detected by client ip.) (This parameter does not work with AJAX mode.)
52
+ * @param string $default Default Value that will be used if country cannot be detected (optional)
53
+ * @param string $include_blank If this value contains 'true', a empty value will be prepended ('---', i.e. no country) (optional)
54
+ * @param bool $flag If a flag should be added before the country name (In Windows, there are no flags, ISO-Country codes instead. This is a design choice by Windows.)
55
+ * @param bool $tel If the international code should be added after the country name
56
+ * @param bool $ajax 1: Execute this shortcode as AJAX | 0: Execute this shortcode on the server | Unset: Use the global settings (execute as AJAX if both 'AJAX' and 'Resolve shortcodes (via Ajax)' are enabled)
57
+ *
58
+ * @return string The generated HTML
59
+ */
60
+ function geoip_detect2_shortcode_country_select($attr) {
61
+ $shortcode_options = _geoip_detect2_shortcode_options($attr);
62
+
63
+ $select_attrs = array(
64
+ 'name' => !empty($attr['name']) ? $attr['name'] : 'geoip-countries',
65
+ 'id' => !empty($attr['id']) ? $attr['id'] : '',
66
+ 'class' => !empty($attr['class']) ? $attr['class'] : 'geoip_detect2_countries',
67
+ 'aria-required' => !empty($attr['required']) ? 'required' : '',
68
+ 'aria-invalid' => !empty($attr['invalid']) ? $attr['invalid'] : '',
69
+ 'autocomplete' => 'off',
70
+ );
71
+
72
+ $selected = '';
73
+ if (geoip_detect2_shortcode_is_ajax_mode($attr) && !isset($attr['selected']) ) {
74
+ geoip_detect2_enqueue_javascript('shortcode');
75
+ $select_attrs['class'] .= ' js-geoip-detect-country-select';
76
+ $select_attrs['data-options'] = wp_json_encode($shortcode_options);
77
+ } else {
78
+ if (!empty($attr['selected'])) {
79
+ $selected = $attr['selected'];
80
+ } else {
81
+ $record = geoip_detect2_get_info_from_current_ip();
82
+ $selected = $record->country->isoCode;
83
+ }
84
+ if (empty($selected)) {
85
+ if (isset($attr['default']))
86
+ $selected = $attr['default'];
87
+ }
88
+ }
89
+
90
+
91
+
92
+ $countryInfo = new YellowTree\GeoipDetect\Geonames\CountryInformation();
93
+ $countries = $countryInfo->getAllCountries($shortcode_options['lang']);
94
+
95
+ if (!empty($attr['flag'])) {
96
+ array_walk($countries, function(&$value, $key) use($countryInfo) {
97
+ $flag = $countryInfo->getFlagEmoji($key);
98
+ $value = $flag . ' ' . $value;
99
+ });
100
+ }
101
+
102
+ if (!empty($attr['tel'])) {
103
+ array_walk($countries, function(&$value, $key) use($countryInfo) {
104
+ $tel = $countryInfo->getTelephonePrefix($key);
105
+ if ($tel) {
106
+ $value = $value . ' (' . $tel . ')';
107
+ }
108
+ });
109
+ }
110
+
111
+ /**
112
+ * Filter: geoip_detect2_shortcode_country_select_countries
113
+ * Change the list of countries that should show up in the select box.
114
+ * You can add, remove, reorder countries at will.
115
+ * If you want to add a blank value (for seperators or so), use a key name that starts with 'blank_'
116
+ * and then something at will in case you need several of them.
117
+ *
118
+ * @param array $countries List of localized country names
119
+ * @param array $attr Parameters that were passed to the shortcode
120
+ * @return array
121
+ */
122
+ $countries = apply_filters('geoip_detect2_shortcode_country_select_countries', $countries, $attr);
123
+
124
+ $html = '<select ' . _geoip_detect_flatten_html_attr($select_attrs) . '>';
125
+ if (!empty($attr['include_blank']) && $attr['include_blank'] !== 'false')
126
+ $html .= '<option value="">---</option>';
127
+ foreach ($countries as $code => $label) {
128
+ if (substr($code, 0, 6) == 'blank_')
129
+ {
130
+ $html .= '<option data-c="" value="">' . esc_html($label) . '</option>';
131
+ }
132
+ else
133
+ {
134
+ $html .= '<option data-c="' . esc_attr(mb_strtolower($code)). '"' . ($code == $selected ? ' selected="selected"' : '') . '>' . esc_html($label) . '</option>';
135
+ }
136
+ }
137
+ $html .= '</select>';
138
+
139
+ return $html;
140
+ }
141
+ add_shortcode('geoip_detect2_countries_select', 'geoip_detect2_shortcode_country_select');
142
+ add_shortcode('geoip_detect2_countries', 'geoip_detect2_shortcode_country_select');
shortcodes/show_if.php ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * Geo-Dependent Content Hiding
6
+ *
7
+ * Uses an enclosing shortcode to selectively show or hide content. Use either
8
+ * [geoip_detect2_show_if][/geoip_detect2_show_if] or [geoip_detect2_hide_if][/geoip_detect2_hide_if] at your
9
+ * discretion, as they can both be used to accomplish the same thing.
10
+ *
11
+ * Shortcode attributes can be as follows:
12
+ *
13
+ * Inclusive Attributes (note that `hide_if` makes them exclusive):
14
+ * "continent", "country", "most_specific_subdivision"/"region"/"state"*, "city"
15
+ *
16
+ * * most_specific_subdivision, region, and state are aliases (use the one that makes the most sense to you)
17
+ *
18
+ * Exclusive Attributes (note that `hide_if` makes them inclusive):
19
+ * "not_country", "not_most_specific_subdivision"/"not_region"/"not_state"*, "not_city"
20
+ *
21
+ * * most_specific_subdivision, region, and state are aliases (use the one that makes the most sense to you)
22
+ *
23
+ * Each attribute may only appear once in a shortcode!
24
+ * The location attributes can take each take full names, ISO abbreviations (e.g., US), or the GeonamesId.
25
+ * All attributes may take multiple values seperated by comma (,).
26
+ *
27
+ * You can use custom property names with the attribute "property" and "property_value" / "not_property_value".
28
+ *
29
+ * Conditions are chained by an AND operator by default, but you can also use operator="or" instead.
30
+ *
31
+ * Examples:
32
+ *
33
+ * Display TEXT if the visitor is in the US and in Texas.
34
+ * `[geoip_detect2_show_if country="US" state="TX"]TEXT[/geoip_detect2_show_if]`
35
+ * - OR -
36
+ * `[geoip_detect2_show_if country="US" region="TX"]TEXT[/geoip_detect2_show_if]`
37
+ * - OR -
38
+ * `[geoip_detect2_show_if country="US" region="Texas"]TEXT[/geoip_detect2_show_if]`
39
+ * - OR -
40
+ * `[geoip_detect2_show_if country="US" most_specific_subdivision="TX"]TEXT[/geoip_detect2_show_if]`
41
+ *
42
+ * Display TEXT if the visitor is in the US, and in either Texas or Louisiana, but hide this content
43
+ * from visitors with IP addresses from cities named Houston.
44
+ * `[geoip_detect2_show_if country="US" state="TX, LA" not_city="Houston"]TEXT[/geoip_detect2_show_if]`
45
+ *
46
+ * Display TEXT if the visitor is from North America.
47
+ * `[geoip_detect2_show_if continent="North America"]TEXT[/geoip_detect2_show_if]`
48
+ * - OR -
49
+ * `[geoip_detect2_hide_if not_continent="North America"]TEXT[/geoip_detect2_hide_if]`
50
+ *
51
+ * Hide TEXT if the visitor is from the US.
52
+ * `[geoip_detect2_hide_if country="US"]TEXT[/geoip_detect2_hide_if]`
53
+ * - OR -
54
+ * `[geoip_detect2_show_if not_country="US"]TEXT[/geoip_detect2_show_if]`
55
+ *
56
+ * Show TEXT if the visitor is within the timezone Europe/Berlin
57
+ * `[geoip_detect2_show_if property="location.timeZone" property_value="Europe/Berlin"]TEXT[/geoip_detect2_show_if]`
58
+ *
59
+ * Show TEXT if the visitor is in the european union
60
+ * `[geoip_detect2_show_if property="country.isInEuropeanUnion" property_value="true"]TEXT[/geoip_detect2_show_if]`
61
+ *
62
+ * Show TEXT if the visitor is from Berlin OR France (since 4.0.0)
63
+ * `[geoip_detect2_show_if city="Berlin" operator="or" country="France"]TEXT[/geoip_detect2_show_if]`
64
+ *
65
+ * LIMITATIONS:
66
+ * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
67
+ * - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
68
+ * - Conditions can either be combined by AND or OR. It is not possible to write this condition within a shortcode: (city = Berlin AND country = Germany) OR country = France
69
+ */
70
+ function geoip_detect2_shortcode_show_if($attr, $content = null, $shortcodeName = '') {
71
+ $shortcode_options = _geoip_detect2_shortcode_options($attr);
72
+ $options = array('skipCache' => $shortcode_options['skip_cache']);
73
+
74
+ $showContentIfMatch = ($shortcodeName === 'geoip_detect2_show_if');
75
+
76
+ $attr = (array) $attr;
77
+
78
+ $parsed = geoip_detect2_shortcode_parse_conditions_from_attributes($attr, !$showContentIfMatch);
79
+
80
+ if (geoip_detect2_shortcode_is_ajax_mode($attr)) {
81
+ geoip_detect2_enqueue_javascript('shortcode');
82
+ $shortcode_options['parsed'] = $parsed;
83
+ $innerHTML= do_shortcode($content);
84
+ return _geoip_detect2_create_placeholder('span', [ 'class' => 'js-geoip-detect-show-if', 'style' => 'display: none !important' ], $shortcode_options, $innerHTML);
85
+ } else {
86
+ $info = geoip_detect2_get_info_from_current_ip($shortcode_options['lang'], $options);
87
+
88
+ /**
89
+ * You can override the detected location information here.
90
+ * E.g. "Show if in Paris, but if the user has given an adress in his profile, use that city instead"
91
+ * (Does not work in AJAX mode)
92
+ *
93
+ * @param YellowTree\GeoipDetect\DataSources\City $info
94
+ * @param array $attr Shortcode attributes given to the function.
95
+ * @param bool $showContentIfMatch Should the content be shown (TRUE) or hidden (FALSE) if the conditions are true?
96
+ */
97
+ $info = apply_filters('geoip_detect2_shortcode_show_if_ip_info_override', $info, $attr, $showContentIfMatch);
98
+
99
+ $evaluated = geoip_detect2_shortcode_evaluate_conditions($parsed, $info);
100
+ // All Criteria Passed?
101
+ if ($evaluated) {
102
+ return do_shortcode($content);
103
+ }
104
+ return '';
105
+ }
106
+ }
107
+ add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
108
+ add_shortcode('geoip_detect2_hide_if', 'geoip_detect2_shortcode_show_if');
109
+
110
+ function geoip_detect2_shortcode_parse_conditions_from_attributes(array $attr, bool $hide_if = false) {
111
+ /* Attribute Conditions. Order is not important, as they are combined with a transitive AND condition */
112
+ $attributeNames = array(
113
+ 'continent' => 'continent',
114
+ 'not_continent' => 'continent',
115
+
116
+ 'country' => 'country',
117
+ 'not_country' => 'country',
118
+
119
+ 'most_specific_subdivision' => 'mostSpecificSubdivision',
120
+ 'region' => 'mostSpecificSubdivision',
121
+ 'state' => 'mostSpecificSubdivision',
122
+ 'not_most_specific_subdivision' => 'mostSpecificSubdivision',
123
+ 'not_region' => 'mostSpecificSubdivision',
124
+ 'not_state' => 'mostSpecificSubdivision',
125
+
126
+ 'city' => 'city',
127
+ 'not_city' => 'city',
128
+ );
129
+
130
+ $parsed = [
131
+ 'op' => ( !empty($attr['operator']) && strtolower($attr['operator']) === 'or' ) ? 'or' : 'and',
132
+ ];
133
+ if ($hide_if) {
134
+ $parsed['not'] = 1;
135
+ }
136
+
137
+ $conditions = [];
138
+
139
+
140
+ foreach ($attributeNames as $shortcodeParamName => $maxmindName) {
141
+ if (!empty($attr[$shortcodeParamName])) {
142
+ $condition = [
143
+ 'p' => $maxmindName,
144
+ 'v' => geoip_detect2_shortcode_prepare_values($attr[$shortcodeParamName]),
145
+ ];
146
+ if (substr($shortcodeParamName, 0, 4) == 'not_') {
147
+ $condition['not'] = 1;
148
+ }
149
+ $conditions[] = $condition;
150
+ }
151
+ }
152
+
153
+ // Custom property
154
+ if (!empty($attr['property'])) {
155
+ if (!empty($attr['property_value'])) {
156
+ $condition = [
157
+ 'p' => $attr['property'],
158
+ 'v' => geoip_detect2_shortcode_prepare_values($attr['property_value']),
159
+ ];
160
+ $conditions[] = $condition;
161
+ } else if (!empty($attr['not_property_value'])) {
162
+ $condition = [
163
+ 'p' => $attr['property'],
164
+ 'v' => geoip_detect2_shortcode_prepare_values($attr['not_property_value']),
165
+ 'not' => 1
166
+ ];
167
+ $conditions[] = $condition;
168
+ }
169
+ }
170
+
171
+ $parsed['conditions'] = $conditions;
172
+
173
+ return apply_filters('geoip_detect2_shortcode_show_if_parsed_result', $parsed, $attr, !$hide_if);
174
+ }
175
+
176
+ function geoip_detect2_shortcode_prepare_values(string $value) : string {
177
+ // Parse User Input Values of Attribute
178
+ $attributeValuesArray = explode(',', $value);
179
+ $attributeValuesArray = array_map('trim', $attributeValuesArray);
180
+ $attributeValuesArray = array_map('mb_strtolower', $attributeValuesArray);
181
+
182
+ return implode(',', $attributeValuesArray);
183
+ }
184
+
185
+ // --------------------------------------------------------------------------------------------------------
186
+ //
187
+
188
+ /**
189
+ * This function has its JS equivalent. If the code is changed here, it also needs to be changed in the JS file.
190
+ *
191
+ * @see ./js/shortcodes.js : function geoip_detect2_shortcode_evaluate_conditions()
192
+ */
193
+ function geoip_detect2_shortcode_evaluate_conditions(array $parsed, \GeoIp2\Model\AbstractModel $info) : bool {
194
+ $alternativePropertyNames = [
195
+ 'name',
196
+ 'isoCode',
197
+ 'code',
198
+ 'geonameId',
199
+ ];
200
+
201
+ $isConditionMatching = ($parsed['op'] === 'or') ? false : true;
202
+
203
+ foreach ($parsed['conditions'] as $condition) {
204
+ // Actual value(s)
205
+ try {
206
+ $value = geoip_detect2_shortcode_get_property($info, $condition['p']);
207
+
208
+ $values = [];
209
+ if (is_object($value)) {
210
+ foreach($alternativePropertyNames as $p) {
211
+ if (isset($value->{$p})) {
212
+ $values[] = $value->{$p};
213
+ }
214
+ }
215
+ } else {
216
+ $values = [ $value ];
217
+ }
218
+
219
+ $subConditionMatching = geoip_detect2_shortcode_check_subcondition($condition['v'], $values);
220
+
221
+ } catch (\Exception $e) {
222
+ // Invalid Property or so... ignore this condition.
223
+ $subConditionMatching = false;
224
+ }
225
+
226
+ if (!empty($condition['not'])) {
227
+ $subConditionMatching = ! $subConditionMatching;
228
+ }
229
+
230
+
231
+ if ($parsed['op'] === 'or') {
232
+ $isConditionMatching = $isConditionMatching || $subConditionMatching;
233
+ } else {
234
+ $isConditionMatching = $isConditionMatching && $subConditionMatching;
235
+ }
236
+ }
237
+
238
+ if (!empty($parsed['not'])) {
239
+ $isConditionMatching = ! $isConditionMatching;
240
+ }
241
+
242
+ return $isConditionMatching;
243
+ }
244
+
245
+ /**
246
+ * This function has its JS equivalent. If the code is changed here, it also needs to be changed in the JS file.
247
+ *
248
+ * @see ./js/shortcodes.js : function geoip_detect2_shortcode_check_subcondition()
249
+ */
250
+ function geoip_detect2_shortcode_check_subcondition(string $expectedValues, array $actualValues) : bool {
251
+ if ($actualValues[0] === true) {
252
+ $actualValues = ['true', 'yes', 'y', '1'];
253
+ } else if ($actualValues[0] === false) {
254
+ $actualValues = ['false', 'no', 'n', '0', ''];
255
+ }
256
+
257
+ $expectedValues = explode(',', $expectedValues);
258
+
259
+ // Compare case-insensitively
260
+ $actualValues = array_map('mb_strtolower', $actualValues);
261
+
262
+ $intersection = array_intersect($actualValues, $expectedValues);
263
+
264
+ return count($intersection) > 0;
265
+ }
upgrade-plugin.php CHANGED
@@ -77,6 +77,14 @@ function geoip_detect_do_upgrade($old_version) {
77
  }
78
  }
79
 
 
 
 
 
 
 
 
 
80
  }
81
 
82
  /**
77
  }
78
  }
79
 
80
+ // v 4.0.0 Fix CCPA auto update hook (re-schedule if necessary)
81
+ if (version_compare('4.0.0', $old_version, '>') && class_exists('\\YellowTree\\GeoipDetect\\Lib\\CcpaBlacklistCron')) {
82
+ if (wp_next_scheduled('geoipdetectccpaupdate') === false) {
83
+ $ccpaCronScheduler = new \YellowTree\GeoipDetect\Lib\CcpaBlacklistCron;
84
+ $ccpaCronScheduler->schedule();
85
+ }
86
+ }
87
+
88
  }
89
 
90
  /**
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite354937679ffa734a3f63544e59103dd::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit18fc54d84025f2e5d2b2ac2dd487f107::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -6,11 +6,8 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
10
- 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
11
  'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
12
- 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
13
- 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
14
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
15
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
16
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -40,6 +37,7 @@ return array(
40
  'GeoIp2\\Record\\RepresentedCountry' => $vendorDir . '/geoip2/geoip2/src/Record/RepresentedCountry.php',
41
  'GeoIp2\\Record\\Subdivision' => $vendorDir . '/geoip2/geoip2/src/Record/Subdivision.php',
42
  'GeoIp2\\Record\\Traits' => $vendorDir . '/geoip2/geoip2/src/Record/Traits.php',
 
43
  'GeoIp2\\WebService\\Client' => $vendorDir . '/geoip2/geoip2/src/WebService/Client.php',
44
  'MaxMind\\Db\\Reader' => $vendorDir . '/maxmind-db/reader/src/MaxMind/Db/Reader.php',
45
  'MaxMind\\Db\\Reader\\Decoder' => $vendorDir . '/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php',
@@ -58,9 +56,91 @@ return array(
58
  'MaxMind\\WebService\\Http\\CurlRequest' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
59
  'MaxMind\\WebService\\Http\\Request' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/Request.php',
60
  'MaxMind\\WebService\\Http\\RequestFactory' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
61
- 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
62
- 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
63
- 'Symfony\\Component\\Inflector\\Inflector' => $vendorDir . '/symfony/inflector/Inflector.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => $vendorDir . '/symfony/property-access/Exception/AccessException.php',
65
  'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/property-access/Exception/ExceptionInterface.php',
66
  'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/property-access/Exception/InvalidArgumentException.php',
@@ -70,6 +150,7 @@ return array(
70
  'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/property-access/Exception/OutOfBoundsException.php',
71
  'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => $vendorDir . '/symfony/property-access/Exception/RuntimeException.php',
72
  'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/property-access/Exception/UnexpectedTypeException.php',
 
73
  'Symfony\\Component\\PropertyAccess\\PropertyAccess' => $vendorDir . '/symfony/property-access/PropertyAccess.php',
74
  'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => $vendorDir . '/symfony/property-access/PropertyAccessor.php',
75
  'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => $vendorDir . '/symfony/property-access/PropertyAccessorBuilder.php',
@@ -79,8 +160,46 @@ return array(
79
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
80
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
81
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
82
- 'Symfony\\Component\\PropertyAccess\\StringUtil' => $vendorDir . '/symfony/property-access/StringUtil.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
84
- 'Symfony\\Polyfill\\Php70\\Php70' => $vendorDir . '/symfony/polyfill-php70/Php70.php',
85
- 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
 
 
 
 
86
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
 
10
  'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php',
 
 
11
  'GeoIp2\\Database\\Reader' => $vendorDir . '/geoip2/geoip2/src/Database/Reader.php',
12
  'GeoIp2\\Exception\\AddressNotFoundException' => $vendorDir . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
13
  'GeoIp2\\Exception\\AuthenticationException' => $vendorDir . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
37
  'GeoIp2\\Record\\RepresentedCountry' => $vendorDir . '/geoip2/geoip2/src/Record/RepresentedCountry.php',
38
  'GeoIp2\\Record\\Subdivision' => $vendorDir . '/geoip2/geoip2/src/Record/Subdivision.php',
39
  'GeoIp2\\Record\\Traits' => $vendorDir . '/geoip2/geoip2/src/Record/Traits.php',
40
+ 'GeoIp2\\Util' => $vendorDir . '/geoip2/geoip2/src/Util.php',
41
  'GeoIp2\\WebService\\Client' => $vendorDir . '/geoip2/geoip2/src/WebService/Client.php',
42
  'MaxMind\\Db\\Reader' => $vendorDir . '/maxmind-db/reader/src/MaxMind/Db/Reader.php',
43
  'MaxMind\\Db\\Reader\\Decoder' => $vendorDir . '/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php',
56
  'MaxMind\\WebService\\Http\\CurlRequest' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
57
  'MaxMind\\WebService\\Http\\Request' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/Request.php',
58
  'MaxMind\\WebService\\Http\\RequestFactory' => $vendorDir . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
59
+ 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
60
+ 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
61
+ 'Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php',
62
+ 'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php',
63
+ 'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php',
64
+ 'Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php',
65
+ 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => $vendorDir . '/symfony/http-foundation/Exception/BadRequestException.php',
66
+ 'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
67
+ 'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => $vendorDir . '/symfony/http-foundation/Exception/JsonException.php',
68
+ 'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
69
+ 'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => $vendorDir . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
70
+ 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/ExpressionRequestMatcher.php',
71
+ 'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php',
72
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
73
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
74
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
75
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php',
76
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
77
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
78
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
79
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoFileException.php',
80
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
81
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/PartialFileException.php',
82
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
83
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php',
84
+ 'Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php',
85
+ 'Symfony\\Component\\HttpFoundation\\File\\Stream' => $vendorDir . '/symfony/http-foundation/File/Stream.php',
86
+ 'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php',
87
+ 'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php',
88
+ 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => $vendorDir . '/symfony/http-foundation/HeaderUtils.php',
89
+ 'Symfony\\Component\\HttpFoundation\\InputBag' => $vendorDir . '/symfony/http-foundation/InputBag.php',
90
+ 'Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php',
91
+ 'Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php',
92
+ 'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php',
93
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => $vendorDir . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
94
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
95
+ 'Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php',
96
+ 'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php',
97
+ 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher.php',
98
+ 'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/RequestMatcherInterface.php',
99
+ 'Symfony\\Component\\HttpFoundation\\RequestStack' => $vendorDir . '/symfony/http-foundation/RequestStack.php',
100
+ 'Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Response.php',
101
+ 'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/ResponseHeaderBag.php',
102
+ 'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php',
103
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBag.php',
104
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php',
105
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php',
106
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php',
107
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBag.php',
108
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php',
109
+ 'Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php',
110
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php',
111
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php',
112
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php',
113
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php',
114
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
115
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
116
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
117
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
118
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
119
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
120
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
121
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
122
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
123
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
124
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
125
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
126
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
127
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
128
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
129
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
130
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
131
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
132
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
133
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
134
+ 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php',
135
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php',
136
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php',
137
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php',
138
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php',
139
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php',
140
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php',
141
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php',
142
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php',
143
+ 'Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php',
144
  'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => $vendorDir . '/symfony/property-access/Exception/AccessException.php',
145
  'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/property-access/Exception/ExceptionInterface.php',
146
  'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/property-access/Exception/InvalidArgumentException.php',
150
  'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/property-access/Exception/OutOfBoundsException.php',
151
  'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => $vendorDir . '/symfony/property-access/Exception/RuntimeException.php',
152
  'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/property-access/Exception/UnexpectedTypeException.php',
153
+ 'Symfony\\Component\\PropertyAccess\\Exception\\UninitializedPropertyException' => $vendorDir . '/symfony/property-access/Exception/UninitializedPropertyException.php',
154
  'Symfony\\Component\\PropertyAccess\\PropertyAccess' => $vendorDir . '/symfony/property-access/PropertyAccess.php',
155
  'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => $vendorDir . '/symfony/property-access/PropertyAccessor.php',
156
  'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => $vendorDir . '/symfony/property-access/PropertyAccessorBuilder.php',
160
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php',
161
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php',
162
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php',
163
+ 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
164
+ 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
165
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
166
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorExtractor' => $vendorDir . '/symfony/property-info/Extractor/ConstructorExtractor.php',
167
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\PhpDocExtractor' => $vendorDir . '/symfony/property-info/Extractor/PhpDocExtractor.php',
168
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ReflectionExtractor' => $vendorDir . '/symfony/property-info/Extractor/ReflectionExtractor.php',
169
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\SerializerExtractor' => $vendorDir . '/symfony/property-info/Extractor/SerializerExtractor.php',
170
+ 'Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyAccessExtractorInterface.php',
171
+ 'Symfony\\Component\\PropertyInfo\\PropertyDescriptionExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyDescriptionExtractorInterface.php',
172
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoCacheExtractor' => $vendorDir . '/symfony/property-info/PropertyInfoCacheExtractor.php',
173
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoExtractor' => $vendorDir . '/symfony/property-info/PropertyInfoExtractor.php',
174
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyInfoExtractorInterface.php',
175
+ 'Symfony\\Component\\PropertyInfo\\PropertyInitializableExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyInitializableExtractorInterface.php',
176
+ 'Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyListExtractorInterface.php',
177
+ 'Symfony\\Component\\PropertyInfo\\PropertyReadInfo' => $vendorDir . '/symfony/property-info/PropertyReadInfo.php',
178
+ 'Symfony\\Component\\PropertyInfo\\PropertyReadInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyReadInfoExtractorInterface.php',
179
+ 'Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyTypeExtractorInterface.php',
180
+ 'Symfony\\Component\\PropertyInfo\\PropertyWriteInfo' => $vendorDir . '/symfony/property-info/PropertyWriteInfo.php',
181
+ 'Symfony\\Component\\PropertyInfo\\PropertyWriteInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyWriteInfoExtractorInterface.php',
182
+ 'Symfony\\Component\\PropertyInfo\\Type' => $vendorDir . '/symfony/property-info/Type.php',
183
+ 'Symfony\\Component\\PropertyInfo\\Util\\PhpDocTypeHelper' => $vendorDir . '/symfony/property-info/Util/PhpDocTypeHelper.php',
184
+ 'Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php',
185
+ 'Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php',
186
+ 'Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php',
187
+ 'Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php',
188
+ 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php',
189
+ 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php',
190
+ 'Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php',
191
+ 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php',
192
+ 'Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php',
193
+ 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php',
194
+ 'Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php',
195
+ 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php',
196
+ 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php',
197
+ 'Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php',
198
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
199
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php',
200
+ 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php',
201
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
202
+ 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php',
203
+ 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
204
+ 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
205
  );
vendor/composer/autoload_files.php CHANGED
@@ -6,6 +6,11 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
 
9
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
10
- '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
 
 
11
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
10
+ '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
11
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
12
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
13
+ '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
14
+ 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
15
+ 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
16
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -6,10 +6,15 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
 
 
 
10
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
 
 
11
  'Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'),
12
- 'Symfony\\Component\\Inflector\\' => array($vendorDir . '/symfony/inflector'),
13
  'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'),
14
  'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'),
15
  'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
10
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
11
+ 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
12
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
13
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
14
+ 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
15
+ 'Symfony\\Component\\PropertyInfo\\' => array($vendorDir . '/symfony/property-info'),
16
  'Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'),
17
+ 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
18
  'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'),
19
  'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'),
20
  'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite354937679ffa734a3f63544e59103dd
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInite354937679ffa734a3f63544e59103dd
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInite354937679ffa734a3f63544e59103dd', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInite354937679ffa734a3f63544e59103dd', '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\ComposerStaticInite354937679ffa734a3f63544e59103dd::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInite354937679ffa734a3f63544e59103dd
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInite354937679ffa734a3f63544e59103dd::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequiree354937679ffa734a3f63544e59103dd($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequiree354937679ffa734a3f63544e59103dd($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit18fc54d84025f2e5d2b2ac2dd487f107
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit18fc54d84025f2e5d2b2ac2dd487f107', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit18fc54d84025f2e5d2b2ac2dd487f107', '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\ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire18fc54d84025f2e5d2b2ac2dd487f107($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire18fc54d84025f2e5d2b2ac2dd487f107($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,20 +4,30 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInite354937679ffa734a3f63544e59103dd
8
  {
9
  public static $files = array (
 
 
 
10
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
11
- '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
 
 
12
  );
13
 
14
  public static $prefixLengthsPsr4 = array (
15
  'S' =>
16
  array (
17
- 'Symfony\\Polyfill\\Php70\\' => 23,
 
 
 
18
  'Symfony\\Polyfill\\Ctype\\' => 23,
 
 
19
  'Symfony\\Component\\PropertyAccess\\' => 33,
20
- 'Symfony\\Component\\Inflector\\' => 28,
21
  ),
22
  'M' =>
23
  array (
@@ -36,21 +46,41 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
36
  );
37
 
38
  public static $prefixDirsPsr4 = array (
39
- 'Symfony\\Polyfill\\Php70\\' =>
40
  array (
41
- 0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
 
 
 
 
 
 
 
 
 
 
 
 
42
  ),
43
  'Symfony\\Polyfill\\Ctype\\' =>
44
  array (
45
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
46
  ),
 
 
 
 
 
 
 
 
47
  'Symfony\\Component\\PropertyAccess\\' =>
48
  array (
49
  0 => __DIR__ . '/..' . '/symfony/property-access',
50
  ),
51
- 'Symfony\\Component\\Inflector\\' =>
52
  array (
53
- 0 => __DIR__ . '/..' . '/symfony/inflector',
54
  ),
55
  'MaxMind\\WebService\\' =>
56
  array (
@@ -75,11 +105,8 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
75
  );
76
 
77
  public static $classMap = array (
78
- 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
79
- 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
80
  'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
81
- 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
82
- 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
83
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
84
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
85
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
@@ -109,6 +136,7 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
109
  'GeoIp2\\Record\\RepresentedCountry' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/RepresentedCountry.php',
110
  'GeoIp2\\Record\\Subdivision' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/Subdivision.php',
111
  'GeoIp2\\Record\\Traits' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/Traits.php',
 
112
  'GeoIp2\\WebService\\Client' => __DIR__ . '/..' . '/geoip2/geoip2/src/WebService/Client.php',
113
  'MaxMind\\Db\\Reader' => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db/Reader.php',
114
  'MaxMind\\Db\\Reader\\Decoder' => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php',
@@ -127,9 +155,91 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
127
  'MaxMind\\WebService\\Http\\CurlRequest' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
128
  'MaxMind\\WebService\\Http\\Request' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/Request.php',
129
  'MaxMind\\WebService\\Http\\RequestFactory' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
130
- 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
131
- 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
132
- 'Symfony\\Component\\Inflector\\Inflector' => __DIR__ . '/..' . '/symfony/inflector/Inflector.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/property-access/Exception/AccessException.php',
134
  'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/property-access/Exception/ExceptionInterface.php',
135
  'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidArgumentException.php',
@@ -139,6 +249,7 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
139
  'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/property-access/Exception/OutOfBoundsException.php',
140
  'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/RuntimeException.php',
141
  'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UnexpectedTypeException.php',
 
142
  'Symfony\\Component\\PropertyAccess\\PropertyAccess' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccess.php',
143
  'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessor.php',
144
  'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorBuilder.php',
@@ -148,18 +259,56 @@ class ComposerStaticInite354937679ffa734a3f63544e59103dd
148
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
149
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
150
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
151
- 'Symfony\\Component\\PropertyAccess\\StringUtil' => __DIR__ . '/..' . '/symfony/property-access/StringUtil.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
153
- 'Symfony\\Polyfill\\Php70\\Php70' => __DIR__ . '/..' . '/symfony/polyfill-php70/Php70.php',
154
- 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
 
 
 
 
155
  );
156
 
157
  public static function getInitializer(ClassLoader $loader)
158
  {
159
  return \Closure::bind(function () use ($loader) {
160
- $loader->prefixLengthsPsr4 = ComposerStaticInite354937679ffa734a3f63544e59103dd::$prefixLengthsPsr4;
161
- $loader->prefixDirsPsr4 = ComposerStaticInite354937679ffa734a3f63544e59103dd::$prefixDirsPsr4;
162
- $loader->classMap = ComposerStaticInite354937679ffa734a3f63544e59103dd::$classMap;
163
 
164
  }, null, ClassLoader::class);
165
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107
8
  {
9
  public static $files = array (
10
+ 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
11
+ '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
12
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
13
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
14
+ '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
15
+ 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
16
+ 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
17
  );
18
 
19
  public static $prefixLengthsPsr4 = array (
20
  'S' =>
21
  array (
22
+ 'Symfony\\Polyfill\\Php80\\' => 23,
23
+ 'Symfony\\Polyfill\\Mbstring\\' => 26,
24
+ 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
25
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
26
  'Symfony\\Polyfill\\Ctype\\' => 23,
27
+ 'Symfony\\Component\\String\\' => 25,
28
+ 'Symfony\\Component\\PropertyInfo\\' => 31,
29
  'Symfony\\Component\\PropertyAccess\\' => 33,
30
+ 'Symfony\\Component\\HttpFoundation\\' => 33,
31
  ),
32
  'M' =>
33
  array (
46
  );
47
 
48
  public static $prefixDirsPsr4 = array (
49
+ 'Symfony\\Polyfill\\Php80\\' =>
50
  array (
51
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
52
+ ),
53
+ 'Symfony\\Polyfill\\Mbstring\\' =>
54
+ array (
55
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
56
+ ),
57
+ 'Symfony\\Polyfill\\Intl\\Normalizer\\' =>
58
+ array (
59
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',
60
+ ),
61
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\' =>
62
+ array (
63
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
64
  ),
65
  'Symfony\\Polyfill\\Ctype\\' =>
66
  array (
67
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
68
  ),
69
+ 'Symfony\\Component\\String\\' =>
70
+ array (
71
+ 0 => __DIR__ . '/..' . '/symfony/string',
72
+ ),
73
+ 'Symfony\\Component\\PropertyInfo\\' =>
74
+ array (
75
+ 0 => __DIR__ . '/..' . '/symfony/property-info',
76
+ ),
77
  'Symfony\\Component\\PropertyAccess\\' =>
78
  array (
79
  0 => __DIR__ . '/..' . '/symfony/property-access',
80
  ),
81
+ 'Symfony\\Component\\HttpFoundation\\' =>
82
  array (
83
+ 0 => __DIR__ . '/..' . '/symfony/http-foundation',
84
  ),
85
  'MaxMind\\WebService\\' =>
86
  array (
105
  );
106
 
107
  public static $classMap = array (
108
+ 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
 
109
  'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php',
 
 
110
  'GeoIp2\\Database\\Reader' => __DIR__ . '/..' . '/geoip2/geoip2/src/Database/Reader.php',
111
  'GeoIp2\\Exception\\AddressNotFoundException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AddressNotFoundException.php',
112
  'GeoIp2\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/geoip2/geoip2/src/Exception/AuthenticationException.php',
136
  'GeoIp2\\Record\\RepresentedCountry' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/RepresentedCountry.php',
137
  'GeoIp2\\Record\\Subdivision' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/Subdivision.php',
138
  'GeoIp2\\Record\\Traits' => __DIR__ . '/..' . '/geoip2/geoip2/src/Record/Traits.php',
139
+ 'GeoIp2\\Util' => __DIR__ . '/..' . '/geoip2/geoip2/src/Util.php',
140
  'GeoIp2\\WebService\\Client' => __DIR__ . '/..' . '/geoip2/geoip2/src/WebService/Client.php',
141
  'MaxMind\\Db\\Reader' => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db/Reader.php',
142
  'MaxMind\\Db\\Reader\\Decoder' => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php',
155
  'MaxMind\\WebService\\Http\\CurlRequest' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/CurlRequest.php',
156
  'MaxMind\\WebService\\Http\\Request' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/Request.php',
157
  'MaxMind\\WebService\\Http\\RequestFactory' => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService/Http/RequestFactory.php',
158
+ 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
159
+ 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
160
+ 'Symfony\\Component\\HttpFoundation\\AcceptHeader' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeader.php',
161
+ 'Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeaderItem.php',
162
+ 'Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => __DIR__ . '/..' . '/symfony/http-foundation/BinaryFileResponse.php',
163
+ 'Symfony\\Component\\HttpFoundation\\Cookie' => __DIR__ . '/..' . '/symfony/http-foundation/Cookie.php',
164
+ 'Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/BadRequestException.php',
165
+ 'Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ConflictingHeadersException.php',
166
+ 'Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/JsonException.php',
167
+ 'Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/RequestExceptionInterface.php',
168
+ 'Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SuspiciousOperationException.php',
169
+ 'Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ExpressionRequestMatcher.php',
170
+ 'Symfony\\Component\\HttpFoundation\\FileBag' => __DIR__ . '/..' . '/symfony/http-foundation/FileBag.php',
171
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/AccessDeniedException.php',
172
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php',
173
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/ExtensionFileException.php',
174
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileException.php',
175
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileNotFoundException.php',
176
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FormSizeFileException.php',
177
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/IniSizeFileException.php',
178
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoFileException.php',
179
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php',
180
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/PartialFileException.php',
181
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php',
182
+ 'Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UploadException.php',
183
+ 'Symfony\\Component\\HttpFoundation\\File\\File' => __DIR__ . '/..' . '/symfony/http-foundation/File/File.php',
184
+ 'Symfony\\Component\\HttpFoundation\\File\\Stream' => __DIR__ . '/..' . '/symfony/http-foundation/File/Stream.php',
185
+ 'Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => __DIR__ . '/..' . '/symfony/http-foundation/File/UploadedFile.php',
186
+ 'Symfony\\Component\\HttpFoundation\\HeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderBag.php',
187
+ 'Symfony\\Component\\HttpFoundation\\HeaderUtils' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderUtils.php',
188
+ 'Symfony\\Component\\HttpFoundation\\InputBag' => __DIR__ . '/..' . '/symfony/http-foundation/InputBag.php',
189
+ 'Symfony\\Component\\HttpFoundation\\IpUtils' => __DIR__ . '/..' . '/symfony/http-foundation/IpUtils.php',
190
+ 'Symfony\\Component\\HttpFoundation\\JsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/JsonResponse.php',
191
+ 'Symfony\\Component\\HttpFoundation\\ParameterBag' => __DIR__ . '/..' . '/symfony/http-foundation/ParameterBag.php',
192
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php',
193
+ 'Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php',
194
+ 'Symfony\\Component\\HttpFoundation\\RedirectResponse' => __DIR__ . '/..' . '/symfony/http-foundation/RedirectResponse.php',
195
+ 'Symfony\\Component\\HttpFoundation\\Request' => __DIR__ . '/..' . '/symfony/http-foundation/Request.php',
196
+ 'Symfony\\Component\\HttpFoundation\\RequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher.php',
197
+ 'Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcherInterface.php',
198
+ 'Symfony\\Component\\HttpFoundation\\RequestStack' => __DIR__ . '/..' . '/symfony/http-foundation/RequestStack.php',
199
+ 'Symfony\\Component\\HttpFoundation\\Response' => __DIR__ . '/..' . '/symfony/http-foundation/Response.php',
200
+ 'Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/ResponseHeaderBag.php',
201
+ 'Symfony\\Component\\HttpFoundation\\ServerBag' => __DIR__ . '/..' . '/symfony/http-foundation/ServerBag.php',
202
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBag.php',
203
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php',
204
+ 'Symfony\\Component\\HttpFoundation\\Session\\Attribute\\NamespacedAttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php',
205
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php',
206
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBag.php',
207
+ 'Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php',
208
+ 'Symfony\\Component\\HttpFoundation\\Session\\Session' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Session.php',
209
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php',
210
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php',
211
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php',
212
+ 'Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php',
213
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php',
214
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php',
215
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php',
216
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php',
217
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php',
218
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php',
219
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php',
220
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php',
221
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php',
222
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php',
223
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php',
224
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php',
225
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MetadataBag.php',
226
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php',
227
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php',
228
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php',
229
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php',
230
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php',
231
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php',
232
+ 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php',
233
+ 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php',
234
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php',
235
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php',
236
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php',
237
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php',
238
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php',
239
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php',
240
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php',
241
+ 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php',
242
+ 'Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php',
243
  'Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/property-access/Exception/AccessException.php',
244
  'Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/property-access/Exception/ExceptionInterface.php',
245
  'Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidArgumentException.php',
249
  'Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/property-access/Exception/OutOfBoundsException.php',
250
  'Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/RuntimeException.php',
251
  'Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UnexpectedTypeException.php',
252
+ 'Symfony\\Component\\PropertyAccess\\Exception\\UninitializedPropertyException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UninitializedPropertyException.php',
253
  'Symfony\\Component\\PropertyAccess\\PropertyAccess' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccess.php',
254
  'Symfony\\Component\\PropertyAccess\\PropertyAccessor' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessor.php',
255
  'Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorBuilder.php',
259
  'Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php',
260
  'Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php',
261
  'Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php',
262
+ 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php',
263
+ 'Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php',
264
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php',
265
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorExtractor.php',
266
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\PhpDocExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/PhpDocExtractor.php',
267
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\ReflectionExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ReflectionExtractor.php',
268
+ 'Symfony\\Component\\PropertyInfo\\Extractor\\SerializerExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/SerializerExtractor.php',
269
+ 'Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyAccessExtractorInterface.php',
270
+ 'Symfony\\Component\\PropertyInfo\\PropertyDescriptionExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyDescriptionExtractorInterface.php',
271
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoCacheExtractor' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoCacheExtractor.php',
272
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoExtractor' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoExtractor.php',
273
+ 'Symfony\\Component\\PropertyInfo\\PropertyInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoExtractorInterface.php',
274
+ 'Symfony\\Component\\PropertyInfo\\PropertyInitializableExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyInitializableExtractorInterface.php',
275
+ 'Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyListExtractorInterface.php',
276
+ 'Symfony\\Component\\PropertyInfo\\PropertyReadInfo' => __DIR__ . '/..' . '/symfony/property-info/PropertyReadInfo.php',
277
+ 'Symfony\\Component\\PropertyInfo\\PropertyReadInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyReadInfoExtractorInterface.php',
278
+ 'Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyTypeExtractorInterface.php',
279
+ 'Symfony\\Component\\PropertyInfo\\PropertyWriteInfo' => __DIR__ . '/..' . '/symfony/property-info/PropertyWriteInfo.php',
280
+ 'Symfony\\Component\\PropertyInfo\\PropertyWriteInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyWriteInfoExtractorInterface.php',
281
+ 'Symfony\\Component\\PropertyInfo\\Type' => __DIR__ . '/..' . '/symfony/property-info/Type.php',
282
+ 'Symfony\\Component\\PropertyInfo\\Util\\PhpDocTypeHelper' => __DIR__ . '/..' . '/symfony/property-info/Util/PhpDocTypeHelper.php',
283
+ 'Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php',
284
+ 'Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php',
285
+ 'Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php',
286
+ 'Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php',
287
+ 'Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php',
288
+ 'Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php',
289
+ 'Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php',
290
+ 'Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php',
291
+ 'Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php',
292
+ 'Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php',
293
+ 'Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php',
294
+ 'Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php',
295
+ 'Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php',
296
+ 'Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php',
297
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
298
+ 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php',
299
+ 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php',
300
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
301
+ 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php',
302
+ 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
303
+ 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
304
  );
305
 
306
  public static function getInitializer(ClassLoader $loader)
307
  {
308
  return \Closure::bind(function () use ($loader) {
309
+ $loader->prefixLengthsPsr4 = ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107::$prefixLengthsPsr4;
310
+ $loader->prefixDirsPsr4 = ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107::$prefixDirsPsr4;
311
+ $loader->classMap = ComposerStaticInit18fc54d84025f2e5d2b2ac2dd487f107::$classMap;
312
 
313
  }, null, ClassLoader::class);
314
  }
vendor/composer/ca-bundle/composer.json CHANGED
@@ -27,9 +27,10 @@
27
  "php": "^5.3.2 || ^7.0 || ^8.0"
28
  },
29
  "require-dev": {
30
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
 
31
  "psr/log": "^1.0",
32
- "symfony/process": "^2.5 || ^3.0 || ^4.0"
33
  },
34
  "autoload": {
35
  "psr-4": {
@@ -43,12 +44,11 @@
43
  },
44
  "extra": {
45
  "branch-alias": {
46
- "dev-master": "1.x-dev"
47
  }
48
  },
49
- "config": {
50
- "platform": {
51
- "php": "5.3.9"
52
- }
53
  }
54
  }
27
  "php": "^5.3.2 || ^7.0 || ^8.0"
28
  },
29
  "require-dev": {
30
+ "symfony/phpunit-bridge": "^4.2 || ^5",
31
+ "phpstan/phpstan": "^0.12.55",
32
  "psr/log": "^1.0",
33
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
34
  },
35
  "autoload": {
36
  "psr-4": {
44
  },
45
  "extra": {
46
  "branch-alias": {
47
+ "dev-main": "1.x-dev"
48
  }
49
  },
50
+ "scripts": {
51
+ "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit",
52
+ "phpstan": "vendor/bin/phpstan analyse"
 
53
  }
54
  }
vendor/composer/ca-bundle/phpstan.neon.dist ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ parameters:
2
+ level: 8
3
+ paths:
4
+ - src
5
+ - tests
vendor/composer/ca-bundle/res/cacert.pem CHANGED
@@ -1,7 +1,7 @@
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
- ## Certificate data from Mozilla as of: Wed Aug 28 03:12:10 2019 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -13,8 +13,8 @@
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
- ## Conversion done with mk-ca-bundle.pl version 1.27.
17
- ## SHA256: fffa309937c3be940649293f749b8207fabc6eb224e50e4bb3f2c5e44e0d6a6b
18
  ##
19
 
20
 
@@ -61,30 +61,6 @@ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
61
  TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
  -----END CERTIFICATE-----
63
 
64
- Verisign Class 3 Public Primary Certification Authority - G3
65
- ============================================================
66
- -----BEGIN CERTIFICATE-----
67
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
- ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
- EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
- cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
- EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
- 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
- ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
- j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
- xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
- t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
- -----END CERTIFICATE-----
87
-
88
  Entrust.net Premium 2048 Secure Server CA
89
  =========================================
90
  -----BEGIN CERTIFICATE-----
@@ -130,30 +106,6 @@ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
  RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
  -----END CERTIFICATE-----
132
 
133
- AddTrust External Root
134
- ======================
135
- -----BEGIN CERTIFICATE-----
136
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
- QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
138
- VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
139
- NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
140
- cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
141
- Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
142
- +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
143
- Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
144
- aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
145
- 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
146
- 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
147
- BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
148
- VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
149
- VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
150
- IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
151
- j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
152
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
153
- e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
154
- G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
155
- -----END CERTIFICATE-----
156
-
157
  Entrust Root Certification Authority
158
  ====================================
159
  -----BEGIN CERTIFICATE-----
@@ -496,36 +448,6 @@ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
496
  QBFGmh95DmK/D5fs4C8fF5Q=
497
  -----END CERTIFICATE-----
498
 
499
- Taiwan GRCA
500
- ===========
501
- -----BEGIN CERTIFICATE-----
502
- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
503
- EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
504
- DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
505
- dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
506
- ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
507
- w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
508
- BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
509
- 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
510
- htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
511
- J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
512
- Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
513
- B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
514
- O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
515
- lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
516
- HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
517
- 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
518
- TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
519
- Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
520
- Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
521
- D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
522
- DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
523
- Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
524
- 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
525
- CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
526
- +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
527
- -----END CERTIFICATE-----
528
-
529
  DigiCert Assured ID Root CA
530
  ===========================
531
  -----BEGIN CERTIFICATE-----
@@ -592,28 +514,6 @@ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
592
  vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
593
  -----END CERTIFICATE-----
594
 
595
- Certplus Class 2 Primary CA
596
- ===========================
597
- -----BEGIN CERTIFICATE-----
598
- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
599
- BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
600
- OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
601
- dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
602
- ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
603
- 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
604
- Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
605
- YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
606
- e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
607
- CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
608
- YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
609
- L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
610
- P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
611
- TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
612
- 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
613
- //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
614
- l7+ijrRU
615
- -----END CERTIFICATE-----
616
-
617
  DST Root CA X3
618
  ==============
619
  -----BEGIN CERTIFICATE-----
@@ -876,29 +776,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
876
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
877
  -----END CERTIFICATE-----
878
 
879
- OISTE WISeKey Global Root GA CA
880
- ===============================
881
- -----BEGIN CERTIFICATE-----
882
- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
883
- BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
884
- A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
885
- bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
886
- VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
887
- IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
888
- IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
889
- Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
890
- Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
891
- d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
892
- /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
893
- LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
894
- AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
895
- KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
896
- MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
897
- +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
898
- hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
899
- okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
900
- -----END CERTIFICATE-----
901
-
902
  Certigna
903
  ========
904
  -----BEGIN CERTIFICATE-----
@@ -921,28 +798,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
921
  WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
922
  -----END CERTIFICATE-----
923
 
924
- Deutsche Telekom Root CA 2
925
- ==========================
926
- -----BEGIN CERTIFICATE-----
927
- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
928
- RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
929
- A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
930
- MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
931
- A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
932
- b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
933
- bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
934
- KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
935
- AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
936
- Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
937
- jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
938
- HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
939
- E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
940
- zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
941
- rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
942
- dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
943
- Cm26OWMohpLzGITY+9HPBVZkVw==
944
- -----END CERTIFICATE-----
945
-
946
  Cybertrust Global Root
947
  ======================
948
  -----BEGIN CERTIFICATE-----
@@ -1170,38 +1025,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1170
  dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1171
  -----END CERTIFICATE-----
1172
 
1173
- Staat der Nederlanden Root CA - G2
1174
- ==================================
1175
- -----BEGIN CERTIFICATE-----
1176
- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
1177
- CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
1178
- Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
1179
- TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
1180
- ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
1181
- 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
1182
- vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
1183
- CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
1184
- e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
1185
- OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
1186
- CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
1187
- 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
1188
- trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
1189
- qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
1190
- AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
1191
- ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
1192
- HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
1193
- A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
1194
- +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
1195
- f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
1196
- kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
1197
- CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
1198
- URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
1199
- CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
1200
- oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
1201
- IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
1202
- 66+KAQ==
1203
- -----END CERTIFICATE-----
1204
-
1205
  Hongkong Post Root CA 1
1206
  =======================
1207
  -----BEGIN CERTIFICATE-----
@@ -1833,30 +1656,6 @@ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
1833
  e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
1834
  -----END CERTIFICATE-----
1835
 
1836
- EE Certification Centre Root CA
1837
- ===============================
1838
- -----BEGIN CERTIFICATE-----
1839
- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
1840
- EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
1841
- dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
1842
- MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
1843
- UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
1844
- ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
1845
- DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
1846
- TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
1847
- rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
1848
- 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
1849
- P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
1850
- AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
1851
- MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
1852
- BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
1853
- xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
1854
- lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
1855
- uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
1856
- 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
1857
- dcGWxZ0=
1858
- -----END CERTIFICATE-----
1859
-
1860
  D-TRUST Root Class 3 CA 2 2009
1861
  ==============================
1862
  -----BEGIN CERTIFICATE-----
@@ -2875,37 +2674,6 @@ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
2875
  AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
2876
  -----END CERTIFICATE-----
2877
 
2878
- LuxTrust Global Root 2
2879
- ======================
2880
- -----BEGIN CERTIFICATE-----
2881
- MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
2882
- A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
2883
- bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
2884
- MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
2885
- AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
2886
- Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
2887
- xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
2888
- wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
2889
- 1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
2890
- FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
2891
- wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
2892
- a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
2893
- ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
2894
- MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
2895
- /zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
2896
- Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
2897
- +Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
2898
- FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
2899
- H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
2900
- 7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
2901
- ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
2902
- VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
2903
- TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
2904
- /f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
2905
- 7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
2906
- iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
2907
- -----END CERTIFICATE-----
2908
-
2909
  TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
2910
  =============================================
2911
  -----BEGIN CERTIFICATE-----
@@ -3474,3 +3242,194 @@ hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
3474
  60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
3475
  dBb9HxEGmpv0
3476
  -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
+ ## Certificate data from Mozilla as of: Tue Dec 8 04:12:05 2020 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.28.
17
+ ## SHA256: d820b8696d8ffe42064a1384a56a8981cdc7e7e198036bbb5fa04a6c282dd9a2
18
  ##
19
 
20
 
61
  TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
  -----END CERTIFICATE-----
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  Entrust.net Premium 2048 Secure Server CA
65
  =========================================
66
  -----BEGIN CERTIFICATE-----
106
  RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
107
  -----END CERTIFICATE-----
108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  Entrust Root Certification Authority
110
  ====================================
111
  -----BEGIN CERTIFICATE-----
448
  QBFGmh95DmK/D5fs4C8fF5Q=
449
  -----END CERTIFICATE-----
450
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
451
  DigiCert Assured ID Root CA
452
  ===========================
453
  -----BEGIN CERTIFICATE-----
514
  vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
515
  -----END CERTIFICATE-----
516
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
  DST Root CA X3
518
  ==============
519
  -----BEGIN CERTIFICATE-----
776
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
777
  -----END CERTIFICATE-----
778
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
779
  Certigna
780
  ========
781
  -----BEGIN CERTIFICATE-----
798
  WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
799
  -----END CERTIFICATE-----
800
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
801
  Cybertrust Global Root
802
  ======================
803
  -----BEGIN CERTIFICATE-----
1025
  dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1026
  -----END CERTIFICATE-----
1027
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
  Hongkong Post Root CA 1
1029
  =======================
1030
  -----BEGIN CERTIFICATE-----
1656
  e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
1657
  -----END CERTIFICATE-----
1658
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1659
  D-TRUST Root Class 3 CA 2 2009
1660
  ==============================
1661
  -----BEGIN CERTIFICATE-----
2674
  AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
2675
  -----END CERTIFICATE-----
2676
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2677
  TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
2678
  =============================================
2679
  -----BEGIN CERTIFICATE-----
3242
  60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
3243
  dBb9HxEGmpv0
3244
  -----END CERTIFICATE-----
3245
+
3246
+ Entrust Root Certification Authority - G4
3247
+ =========================================
3248
+ -----BEGIN CERTIFICATE-----
3249
+ MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV
3250
+ BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
3251
+ bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
3252
+ dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
3253
+ dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT
3254
+ AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
3255
+ L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv
3256
+ cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv
3257
+ cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D
3258
+ umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV
3259
+ 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds
3260
+ 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ
3261
+ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7
3262
+ ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X
3263
+ xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV
3264
+ 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
3265
+ dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW
3266
+ Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T
3267
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n
3268
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q
3269
+ jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht
3270
+ 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK
3271
+ YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt
3272
+ jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+
3273
+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW
3274
+ RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA
3275
+ JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G
3276
+ +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT
3277
+ kcpG2om3PVODLAgfi49T3f+sHw==
3278
+ -----END CERTIFICATE-----
3279
+
3280
+ Microsoft ECC Root Certificate Authority 2017
3281
+ =============================================
3282
+ -----BEGIN CERTIFICATE-----
3283
+ MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
3284
+ UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
3285
+ IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
3286
+ MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
3287
+ NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
3288
+ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
3289
+ thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
3290
+ eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
3291
+ +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
3292
+ Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
3293
+ eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
3294
+ -----END CERTIFICATE-----
3295
+
3296
+ Microsoft RSA Root Certificate Authority 2017
3297
+ =============================================
3298
+ -----BEGIN CERTIFICATE-----
3299
+ MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
3300
+ EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
3301
+ UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
3302
+ NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
3303
+ MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
3304
+ ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
3305
+ 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
3306
+ S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
3307
+ 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
3308
+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
3309
+ yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
3310
+ MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
3311
+ lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
3312
+ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
3313
+ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
3314
+ DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
3315
+ NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
3316
+ 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
3317
+ dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
3318
+ +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
3319
+ /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
3320
+ AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
3321
+ ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
3322
+ 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
3323
+ c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
3324
+ 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
3325
+ -----END CERTIFICATE-----
3326
+
3327
+ e-Szigno Root CA 2017
3328
+ =====================
3329
+ -----BEGIN CERTIFICATE-----
3330
+ MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
3331
+ DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
3332
+ MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
3333
+ Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
3334
+ CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
3335
+ Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
3336
+ s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
3337
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
3338
+ vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
3339
+ tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
3340
+ svxyqltZ+efcMQ==
3341
+ -----END CERTIFICATE-----
3342
+
3343
+ certSIGN Root CA G2
3344
+ ===================
3345
+ -----BEGIN CERTIFICATE-----
3346
+ MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
3347
+ EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
3348
+ MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
3349
+ TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
3350
+ ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
3351
+ N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
3352
+ abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
3353
+ wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
3354
+ dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
3355
+ ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
3356
+ jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
3357
+ 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
3358
+ z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
3359
+ iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
3360
+ DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
3361
+ ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
3362
+ b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
3363
+ /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
3364
+ 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
3365
+ BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
3366
+ atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
3367
+ Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
3368
+ NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
3369
+ 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
3370
+ -----END CERTIFICATE-----
3371
+
3372
+ Trustwave Global Certification Authority
3373
+ ========================================
3374
+ -----BEGIN CERTIFICATE-----
3375
+ MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV
3376
+ UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
3377
+ ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
3378
+ IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV
3379
+ UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
3380
+ ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
3381
+ IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29
3382
+ zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf
3383
+ LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq
3384
+ stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o
3385
+ WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+
3386
+ OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40
3387
+ Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE
3388
+ uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm
3389
+ +9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj
3390
+ ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
3391
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB
3392
+ BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H
3393
+ PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H
3394
+ ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla
3395
+ 4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R
3396
+ vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd
3397
+ zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O
3398
+ 856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH
3399
+ Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu
3400
+ 3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP
3401
+ 29FpHOTKyeC2nOnOcXHebD8WpHk=
3402
+ -----END CERTIFICATE-----
3403
+
3404
+ Trustwave Global ECC P256 Certification Authority
3405
+ =================================================
3406
+ -----BEGIN CERTIFICATE-----
3407
+ MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
3408
+ MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
3409
+ b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
3410
+ Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
3411
+ VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
3412
+ dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
3413
+ NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
3414
+ 43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
3415
+ P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
3416
+ 0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
3417
+ RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
3418
+ -----END CERTIFICATE-----
3419
+
3420
+ Trustwave Global ECC P384 Certification Authority
3421
+ =================================================
3422
+ -----BEGIN CERTIFICATE-----
3423
+ MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
3424
+ MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
3425
+ b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
3426
+ Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
3427
+ VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
3428
+ dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
3429
+ NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
3430
+ Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
3431
+ /TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
3432
+ HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
3433
+ ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
3434
+ CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
3435
+ -----END CERTIFICATE-----
vendor/composer/ca-bundle/src/CaBundle.php CHANGED
@@ -20,8 +20,11 @@ use Symfony\Component\Process\PhpProcess;
20
  */
21
  class CaBundle
22
  {
 
23
  private static $caPath;
 
24
  private static $caFileValidity = array();
 
25
  private static $useOpensslParse;
26
 
27
  /**
@@ -68,14 +71,13 @@ class CaBundle
68
  }
69
  $caBundlePaths = array();
70
 
71
-
72
  // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
73
  // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
74
- $caBundlePaths[] = getenv('SSL_CERT_FILE');
75
 
76
  // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
77
  // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
78
- $caBundlePaths[] = getenv('SSL_CERT_DIR');
79
 
80
  $caBundlePaths[] = ini_get('openssl.cafile');
81
  $caBundlePaths[] = ini_get('openssl.capath');
@@ -92,6 +94,7 @@ class CaBundle
92
  '/etc/ssl/cert.pem', // OpenBSD
93
  '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
94
  '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
 
95
  );
96
 
97
  foreach($otherLocations as $location) {
@@ -101,11 +104,11 @@ class CaBundle
101
  $caBundlePaths = array_merge($caBundlePaths, $otherLocations);
102
 
103
  foreach ($caBundlePaths as $caBundle) {
104
- if (self::caFileUsable($caBundle, $logger)) {
105
  return self::$caPath = $caBundle;
106
  }
107
 
108
- if (self::caDirUsable($caBundle)) {
109
  return self::$caPath = $caBundle;
110
  }
111
  }
@@ -127,8 +130,13 @@ class CaBundle
127
  // cURL does not understand 'phar://' paths
128
  // see https://github.com/composer/ca-bundle/issues/10
129
  if (0 === strpos($caBundleFile, 'phar://')) {
 
 
 
 
 
130
  file_put_contents(
131
- $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'),
132
  file_get_contents($caBundleFile)
133
  );
134
 
@@ -172,8 +180,16 @@ class CaBundle
172
  }
173
 
174
  $isValid = !empty($contents);
 
 
 
 
 
 
 
 
175
  } else {
176
- $isValid = (bool) openssl_x509_parse($contents);
177
  }
178
 
179
  if ($logger) {
@@ -208,7 +224,7 @@ class CaBundle
208
  if (
209
  (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
210
  || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
211
- || (PHP_VERSION_ID < 50600 && PHP_VERSION_ID >= 50507)
212
  ) {
213
  // This version of PHP has the fix for CVE-2013-6420 applied.
214
  return self::$useOpensslParse = true;
@@ -275,7 +291,8 @@ EOT;
275
  $errorOutput = trim($process->getErrorOutput());
276
 
277
  if (
278
- count($output) === 3
 
279
  && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
280
  && $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
281
  && $output[2] === 'int(-1)'
@@ -290,6 +307,7 @@ EOT;
290
 
291
  /**
292
  * Resets the static caches
 
293
  */
294
  public static function reset()
295
  {
@@ -298,11 +316,36 @@ EOT;
298
  self::$useOpensslParse = null;
299
  }
300
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  private static function caFileUsable($certFile, LoggerInterface $logger = null)
302
  {
303
  return $certFile && @is_file($certFile) && @is_readable($certFile) && static::validateCaFile($certFile, $logger);
304
  }
305
 
 
 
 
 
306
  private static function caDirUsable($certDir)
307
  {
308
  return $certDir && @is_dir($certDir) && @is_readable($certDir) && glob($certDir . '/*');
20
  */
21
  class CaBundle
22
  {
23
+ /** @var string|null */
24
  private static $caPath;
25
+ /** @var array<string, bool> */
26
  private static $caFileValidity = array();
27
+ /** @var bool|null */
28
  private static $useOpensslParse;
29
 
30
  /**
71
  }
72
  $caBundlePaths = array();
73
 
 
74
  // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
75
  // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
76
+ $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE');
77
 
78
  // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
79
  // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
80
+ $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR');
81
 
82
  $caBundlePaths[] = ini_get('openssl.cafile');
83
  $caBundlePaths[] = ini_get('openssl.capath');
94
  '/etc/ssl/cert.pem', // OpenBSD
95
  '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
96
  '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
97
+ '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package
98
  );
99
 
100
  foreach($otherLocations as $location) {
104
  $caBundlePaths = array_merge($caBundlePaths, $otherLocations);
105
 
106
  foreach ($caBundlePaths as $caBundle) {
107
+ if ($caBundle && self::caFileUsable($caBundle, $logger)) {
108
  return self::$caPath = $caBundle;
109
  }
110
 
111
+ if ($caBundle && self::caDirUsable($caBundle)) {
112
  return self::$caPath = $caBundle;
113
  }
114
  }
130
  // cURL does not understand 'phar://' paths
131
  // see https://github.com/composer/ca-bundle/issues/10
132
  if (0 === strpos($caBundleFile, 'phar://')) {
133
+ $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-');
134
+ if (false === $tempCaBundleFile) {
135
+ throw new \RuntimeException('Could not create a temporary file to store the bundled CA file');
136
+ }
137
+
138
  file_put_contents(
139
+ $tempCaBundleFile,
140
  file_get_contents($caBundleFile)
141
  );
142
 
180
  }
181
 
182
  $isValid = !empty($contents);
183
+ } elseif (is_string($contents) && strlen($contents) > 0) {
184
+ $contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents);
185
+ if (null === $contents) {
186
+ // regex extraction failed
187
+ $isValid = false;
188
+ } else {
189
+ $isValid = (bool) openssl_x509_parse($contents);
190
+ }
191
  } else {
192
+ $isValid = false;
193
  }
194
 
195
  if ($logger) {
224
  if (
225
  (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
226
  || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
227
+ || PHP_VERSION_ID >= 50507
228
  ) {
229
  // This version of PHP has the fix for CVE-2013-6420 applied.
230
  return self::$useOpensslParse = true;
291
  $errorOutput = trim($process->getErrorOutput());
292
 
293
  if (
294
+ is_array($output)
295
+ && count($output) === 3
296
  && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
297
  && $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
298
  && $output[2] === 'int(-1)'
307
 
308
  /**
309
  * Resets the static caches
310
+ * @return void
311
  */
312
  public static function reset()
313
  {
316
  self::$useOpensslParse = null;
317
  }
318
 
319
+ /**
320
+ * @param string $name
321
+ * @return string|false
322
+ */
323
+ private static function getEnvVariable($name)
324
+ {
325
+ if (isset($_SERVER[$name])) {
326
+ return (string) $_SERVER[$name];
327
+ }
328
+
329
+ if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) {
330
+ return (string) $value;
331
+ }
332
+
333
+ return false;
334
+ }
335
+
336
+ /**
337
+ * @param string|false $certFile
338
+ * @return bool
339
+ */
340
  private static function caFileUsable($certFile, LoggerInterface $logger = null)
341
  {
342
  return $certFile && @is_file($certFile) && @is_readable($certFile) && static::validateCaFile($certFile, $logger);
343
  }
344
 
345
+ /**
346
+ * @param string|false $certDir
347
+ * @return bool
348
+ */
349
  private static function caDirUsable($certDir)
350
  {
351
  return $certDir && @is_dir($certDir) && @is_readable($certDir) && glob($certDir . '/*');
vendor/composer/installed.json CHANGED
@@ -1,17 +1,17 @@
1
  [
2
  {
3
  "name": "composer/ca-bundle",
4
- "version": "1.2.4",
5
- "version_normalized": "1.2.4.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/composer/ca-bundle.git",
9
- "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527",
14
- "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527",
15
  "shasum": ""
16
  },
17
  "require": {
@@ -20,15 +20,16 @@
20
  "php": "^5.3.2 || ^7.0 || ^8.0"
21
  },
22
  "require-dev": {
23
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
24
  "psr/log": "^1.0",
25
- "symfony/process": "^2.5 || ^3.0 || ^4.0"
 
26
  },
27
- "time": "2019-08-30T08:44:50+00:00",
28
  "type": "library",
29
  "extra": {
30
  "branch-alias": {
31
- "dev-master": "1.x-dev"
32
  }
33
  },
34
  "installation-source": "dist",
@@ -59,30 +60,31 @@
59
  },
60
  {
61
  "name": "geoip2/geoip2",
62
- "version": "v2.9.0",
63
- "version_normalized": "2.9.0.0",
64
  "source": {
65
  "type": "git",
66
  "url": "https://github.com/maxmind/GeoIP2-php.git",
67
- "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77"
68
  },
69
  "dist": {
70
  "type": "zip",
71
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/a807fbf65212eef5d8d2db1a1b31082b53633d77",
72
- "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77",
73
  "shasum": ""
74
  },
75
  "require": {
76
- "maxmind-db/reader": "~1.0",
77
- "maxmind/web-service-common": "~0.5",
78
- "php": ">=5.4"
 
79
  },
80
  "require-dev": {
81
  "friendsofphp/php-cs-fixer": "2.*",
82
- "phpunit/phpunit": "4.*",
83
  "squizlabs/php_codesniffer": "3.*"
84
  },
85
- "time": "2018-04-10T15:32:59+00:00",
86
  "type": "library",
87
  "installation-source": "dist",
88
  "autoload": {
@@ -98,7 +100,7 @@
98
  {
99
  "name": "Gregory J. Oschwald",
100
  "email": "goschwald@maxmind.com",
101
- "homepage": "http://www.maxmind.com/"
102
  }
103
  ],
104
  "description": "MaxMind GeoIP2 PHP API",
@@ -113,27 +115,31 @@
113
  },
114
  {
115
  "name": "maxmind-db/reader",
116
- "version": "v1.5.0",
117
- "version_normalized": "1.5.0.0",
118
  "source": {
119
  "type": "git",
120
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
121
- "reference": "bd436094fc0a9b0558a899fb80b0ae34fe1808a0"
122
  },
123
  "dist": {
124
  "type": "zip",
125
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/bd436094fc0a9b0558a899fb80b0ae34fe1808a0",
126
- "reference": "bd436094fc0a9b0558a899fb80b0ae34fe1808a0",
127
  "shasum": ""
128
  },
129
  "require": {
130
- "php": ">=5.6"
 
 
 
131
  },
132
  "require-dev": {
133
- "friendsofphp/php-cs-fixer": "2.*",
134
  "php-coveralls/php-coveralls": "^2.1",
135
- "phpunit/phpcov": "^3.0",
136
- "phpunit/phpunit": "5.*",
 
137
  "squizlabs/php_codesniffer": "3.*"
138
  },
139
  "suggest": {
@@ -141,7 +147,7 @@
141
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
142
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
143
  },
144
- "time": "2019-09-30T22:56:38+00:00",
145
  "type": "library",
146
  "installation-source": "dist",
147
  "autoload": {
@@ -172,31 +178,31 @@
172
  },
173
  {
174
  "name": "maxmind/web-service-common",
175
- "version": "v0.5.0",
176
- "version_normalized": "0.5.0.0",
177
  "source": {
178
  "type": "git",
179
  "url": "https://github.com/maxmind/web-service-common-php.git",
180
- "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b"
181
  },
182
  "dist": {
183
  "type": "zip",
184
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/61a9836fa3bb1743ab89752bae5005d71e78c73b",
185
- "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b",
186
  "shasum": ""
187
  },
188
  "require": {
189
  "composer/ca-bundle": "^1.0.3",
190
  "ext-curl": "*",
191
  "ext-json": "*",
192
- "php": ">=5.4"
193
  },
194
  "require-dev": {
195
  "friendsofphp/php-cs-fixer": "2.*",
196
- "phpunit/phpunit": "4.*",
197
  "squizlabs/php_codesniffer": "3.*"
198
  },
199
- "time": "2018-02-12T22:31:54+00:00",
200
  "type": "library",
201
  "installation-source": "dist",
202
  "autoload": {
@@ -219,85 +225,218 @@
219
  "homepage": "https://github.com/maxmind/web-service-common-php"
220
  },
221
  {
222
- "name": "paragonie/random_compat",
223
- "version": "v9.99.99",
224
- "version_normalized": "9.99.99.0",
225
  "source": {
226
  "type": "git",
227
- "url": "https://github.com/paragonie/random_compat.git",
228
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
229
  },
230
  "dist": {
231
  "type": "zip",
232
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
233
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
234
  "shasum": ""
235
  },
236
  "require": {
237
- "php": "^7"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  },
239
  "require-dev": {
240
- "phpunit/phpunit": "4.*|5.*",
241
- "vimeo/psalm": "^1"
 
 
242
  },
243
  "suggest": {
244
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
245
  },
246
- "time": "2018-07-02T15:55:56+00:00",
247
  "type": "library",
248
  "installation-source": "dist",
 
 
 
 
 
 
 
 
249
  "notification-url": "https://packagist.org/downloads/",
250
  "license": [
251
  "MIT"
252
  ],
253
  "authors": [
254
  {
255
- "name": "Paragon Initiative Enterprises",
256
- "email": "security@paragonie.com",
257
- "homepage": "https://paragonie.com"
 
 
 
258
  }
259
  ],
260
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  "keywords": [
262
- "csprng",
 
263
  "polyfill",
264
- "pseudorandom",
265
- "random"
266
  ]
267
  },
268
  {
269
- "name": "symfony/inflector",
270
- "version": "v4.4.10",
271
- "version_normalized": "4.4.10.0",
272
  "source": {
273
  "type": "git",
274
- "url": "https://github.com/symfony/inflector.git",
275
- "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7"
276
  },
277
  "dist": {
278
  "type": "zip",
279
- "url": "https://api.github.com/repos/symfony/inflector/zipball/3330be44724db42f0aa493002ae63f5d29f8d5f7",
280
- "reference": "3330be44724db42f0aa493002ae63f5d29f8d5f7",
281
  "shasum": ""
282
  },
283
  "require": {
284
- "php": ">=7.1.3",
285
- "symfony/polyfill-ctype": "~1.8"
 
 
286
  },
287
- "time": "2020-05-20T08:37:50+00:00",
288
  "type": "library",
289
  "extra": {
290
  "branch-alias": {
291
- "dev-master": "4.4-dev"
 
 
 
 
292
  }
293
  },
294
  "installation-source": "dist",
295
  "autoload": {
296
  "psr-4": {
297
- "Symfony\\Component\\Inflector\\": ""
298
  },
299
- "exclude-from-classmap": [
300
- "/Tests/"
301
  ]
302
  },
303
  "notification-url": "https://packagist.org/downloads/",
@@ -306,51 +445,51 @@
306
  ],
307
  "authors": [
308
  {
309
- "name": "Bernhard Schussek",
310
- "email": "bschussek@gmail.com"
311
  },
312
  {
313
  "name": "Symfony Community",
314
  "homepage": "https://symfony.com/contributors"
315
  }
316
  ],
317
- "description": "Symfony Inflector Component",
318
  "homepage": "https://symfony.com",
319
  "keywords": [
320
- "inflection",
321
- "pluralize",
322
- "singularize",
323
- "string",
324
- "symfony",
325
- "words"
326
  ]
327
  },
328
  {
329
- "name": "symfony/polyfill-ctype",
330
- "version": "v1.17.1",
331
- "version_normalized": "1.17.1.0",
332
  "source": {
333
  "type": "git",
334
- "url": "https://github.com/symfony/polyfill-ctype.git",
335
- "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d"
336
  },
337
  "dist": {
338
  "type": "zip",
339
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
340
- "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d",
341
  "shasum": ""
342
  },
343
  "require": {
344
- "php": ">=5.3.3"
345
  },
346
  "suggest": {
347
- "ext-ctype": "For best performance"
348
  },
349
- "time": "2020-06-06T08:46:27+00:00",
350
  "type": "library",
351
  "extra": {
352
  "branch-alias": {
353
- "dev-master": "1.17-dev"
354
  },
355
  "thanks": {
356
  "name": "symfony/polyfill",
@@ -360,10 +499,13 @@
360
  "installation-source": "dist",
361
  "autoload": {
362
  "psr-4": {
363
- "Symfony\\Polyfill\\Ctype\\": ""
364
  },
365
  "files": [
366
  "bootstrap.php"
 
 
 
367
  ]
368
  },
369
  "notification-url": "https://packagist.org/downloads/",
@@ -372,47 +514,51 @@
372
  ],
373
  "authors": [
374
  {
375
- "name": "Gert de Pagter",
376
- "email": "BackEndTea@gmail.com"
377
  },
378
  {
379
  "name": "Symfony Community",
380
  "homepage": "https://symfony.com/contributors"
381
  }
382
  ],
383
- "description": "Symfony polyfill for ctype functions",
384
  "homepage": "https://symfony.com",
385
  "keywords": [
386
  "compatibility",
387
- "ctype",
 
388
  "polyfill",
389
- "portable"
 
390
  ]
391
  },
392
  {
393
- "name": "symfony/polyfill-php70",
394
- "version": "v1.17.1",
395
- "version_normalized": "1.17.1.0",
396
  "source": {
397
  "type": "git",
398
- "url": "https://github.com/symfony/polyfill-php70.git",
399
- "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d"
400
  },
401
  "dist": {
402
  "type": "zip",
403
- "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/471b096aede7025bace8eb356b9ac801aaba7e2d",
404
- "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d",
405
  "shasum": ""
406
  },
407
  "require": {
408
- "paragonie/random_compat": "~1.0|~2.0|~9.99",
409
- "php": ">=5.3.3"
410
  },
411
- "time": "2020-06-06T08:46:27+00:00",
 
 
 
412
  "type": "library",
413
  "extra": {
414
  "branch-alias": {
415
- "dev-master": "1.17-dev"
416
  },
417
  "thanks": {
418
  "name": "symfony/polyfill",
@@ -422,7 +568,69 @@
422
  "installation-source": "dist",
423
  "autoload": {
424
  "psr-4": {
425
- "Symfony\\Polyfill\\Php70\\": ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  },
427
  "files": [
428
  "bootstrap.php"
@@ -436,6 +644,10 @@
436
  "MIT"
437
  ],
438
  "authors": [
 
 
 
 
439
  {
440
  "name": "Nicolas Grekas",
441
  "email": "p@tchwork.com"
@@ -445,7 +657,7 @@
445
  "homepage": "https://symfony.com/contributors"
446
  }
447
  ],
448
- "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
449
  "homepage": "https://symfony.com",
450
  "keywords": [
451
  "compatibility",
@@ -456,37 +668,33 @@
456
  },
457
  {
458
  "name": "symfony/property-access",
459
- "version": "v3.4.42",
460
- "version_normalized": "3.4.42.0",
461
  "source": {
462
  "type": "git",
463
  "url": "https://github.com/symfony/property-access.git",
464
- "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85"
465
  },
466
  "dist": {
467
  "type": "zip",
468
- "url": "https://api.github.com/repos/symfony/property-access/zipball/e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
469
- "reference": "e1a6c91c0007e45bc1beba929c76548ca9fe8a85",
470
  "shasum": ""
471
  },
472
  "require": {
473
- "php": "^5.5.9|>=7.0.8",
474
- "symfony/inflector": "~3.1|~4.0",
475
- "symfony/polyfill-php70": "~1.0"
 
476
  },
477
  "require-dev": {
478
- "symfony/cache": "~3.1|~4.0"
479
  },
480
  "suggest": {
481
  "psr/cache-implementation": "To cache access methods."
482
  },
483
- "time": "2020-05-29T00:04:36+00:00",
484
  "type": "library",
485
- "extra": {
486
- "branch-alias": {
487
- "dev-master": "3.4-dev"
488
- }
489
- },
490
  "installation-source": "dist",
491
  "autoload": {
492
  "psr-4": {
@@ -510,7 +718,7 @@
510
  "homepage": "https://symfony.com/contributors"
511
  }
512
  ],
513
- "description": "Symfony PropertyAccess Component",
514
  "homepage": "https://symfony.com",
515
  "keywords": [
516
  "access",
@@ -523,5 +731,148 @@
523
  "property path",
524
  "reflection"
525
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
  }
527
  ]
1
  [
2
  {
3
  "name": "composer/ca-bundle",
4
+ "version": "1.2.9",
5
+ "version_normalized": "1.2.9.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/composer/ca-bundle.git",
9
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
14
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
15
  "shasum": ""
16
  },
17
  "require": {
20
  "php": "^5.3.2 || ^7.0 || ^8.0"
21
  },
22
  "require-dev": {
23
+ "phpstan/phpstan": "^0.12.55",
24
  "psr/log": "^1.0",
25
+ "symfony/phpunit-bridge": "^4.2 || ^5",
26
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
27
  },
28
+ "time": "2021-01-12T12:10:35+00:00",
29
  "type": "library",
30
  "extra": {
31
  "branch-alias": {
32
+ "dev-main": "1.x-dev"
33
  }
34
  },
35
  "installation-source": "dist",
60
  },
61
  {
62
  "name": "geoip2/geoip2",
63
+ "version": "v2.11.0",
64
+ "version_normalized": "2.11.0.0",
65
  "source": {
66
  "type": "git",
67
  "url": "https://github.com/maxmind/GeoIP2-php.git",
68
+ "reference": "d01be5894a5c1a3381c58c9b1795cd07f96c30f7"
69
  },
70
  "dist": {
71
  "type": "zip",
72
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/d01be5894a5c1a3381c58c9b1795cd07f96c30f7",
73
+ "reference": "d01be5894a5c1a3381c58c9b1795cd07f96c30f7",
74
  "shasum": ""
75
  },
76
  "require": {
77
+ "ext-json": "*",
78
+ "maxmind-db/reader": "~1.8",
79
+ "maxmind/web-service-common": "~0.8",
80
+ "php": ">=7.2"
81
  },
82
  "require-dev": {
83
  "friendsofphp/php-cs-fixer": "2.*",
84
+ "phpunit/phpunit": "^8.0 || ^9.0",
85
  "squizlabs/php_codesniffer": "3.*"
86
  },
87
+ "time": "2020-10-01T18:48:34+00:00",
88
  "type": "library",
89
  "installation-source": "dist",
90
  "autoload": {
100
  {
101
  "name": "Gregory J. Oschwald",
102
  "email": "goschwald@maxmind.com",
103
+ "homepage": "https://www.maxmind.com/"
104
  }
105
  ],
106
  "description": "MaxMind GeoIP2 PHP API",
115
  },
116
  {
117
  "name": "maxmind-db/reader",
118
+ "version": "v1.10.0",
119
+ "version_normalized": "1.10.0.0",
120
  "source": {
121
  "type": "git",
122
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
123
+ "reference": "07f84d969cfc527ce49388558a366ad376f1f35c"
124
  },
125
  "dist": {
126
  "type": "zip",
127
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c",
128
+ "reference": "07f84d969cfc527ce49388558a366ad376f1f35c",
129
  "shasum": ""
130
  },
131
  "require": {
132
+ "php": ">=7.2"
133
+ },
134
+ "conflict": {
135
+ "ext-maxminddb": "<1.10.0,>=2.0.0"
136
  },
137
  "require-dev": {
138
+ "friendsofphp/php-cs-fixer": "*",
139
  "php-coveralls/php-coveralls": "^2.1",
140
+ "phpstan/phpstan": "*",
141
+ "phpunit/phpcov": ">=6.0.0",
142
+ "phpunit/phpunit": ">=8.0.0,<10.0.0",
143
  "squizlabs/php_codesniffer": "3.*"
144
  },
145
  "suggest": {
147
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
148
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
149
  },
150
+ "time": "2021-02-09T17:52:47+00:00",
151
  "type": "library",
152
  "installation-source": "dist",
153
  "autoload": {
178
  },
179
  {
180
  "name": "maxmind/web-service-common",
181
+ "version": "v0.8.1",
182
+ "version_normalized": "0.8.1.0",
183
  "source": {
184
  "type": "git",
185
  "url": "https://github.com/maxmind/web-service-common-php.git",
186
+ "reference": "32f274051c543fc865e5a84d3a2c703913641ea8"
187
  },
188
  "dist": {
189
  "type": "zip",
190
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/32f274051c543fc865e5a84d3a2c703913641ea8",
191
+ "reference": "32f274051c543fc865e5a84d3a2c703913641ea8",
192
  "shasum": ""
193
  },
194
  "require": {
195
  "composer/ca-bundle": "^1.0.3",
196
  "ext-curl": "*",
197
  "ext-json": "*",
198
+ "php": ">=7.2"
199
  },
200
  "require-dev": {
201
  "friendsofphp/php-cs-fixer": "2.*",
202
+ "phpunit/phpunit": "^8.0 || ^9.0",
203
  "squizlabs/php_codesniffer": "3.*"
204
  },
205
+ "time": "2020-11-02T17:00:53+00:00",
206
  "type": "library",
207
  "installation-source": "dist",
208
  "autoload": {
225
  "homepage": "https://github.com/maxmind/web-service-common-php"
226
  },
227
  {
228
+ "name": "symfony/deprecation-contracts",
229
+ "version": "v2.2.0",
230
+ "version_normalized": "2.2.0.0",
231
  "source": {
232
  "type": "git",
233
+ "url": "https://github.com/symfony/deprecation-contracts.git",
234
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
235
  },
236
  "dist": {
237
  "type": "zip",
238
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
239
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
240
  "shasum": ""
241
  },
242
  "require": {
243
+ "php": ">=7.1"
244
+ },
245
+ "time": "2020-09-07T11:33:47+00:00",
246
+ "type": "library",
247
+ "extra": {
248
+ "branch-alias": {
249
+ "dev-master": "2.2-dev"
250
+ },
251
+ "thanks": {
252
+ "name": "symfony/contracts",
253
+ "url": "https://github.com/symfony/contracts"
254
+ }
255
+ },
256
+ "installation-source": "dist",
257
+ "autoload": {
258
+ "files": [
259
+ "function.php"
260
+ ]
261
+ },
262
+ "notification-url": "https://packagist.org/downloads/",
263
+ "license": [
264
+ "MIT"
265
+ ],
266
+ "authors": [
267
+ {
268
+ "name": "Nicolas Grekas",
269
+ "email": "p@tchwork.com"
270
+ },
271
+ {
272
+ "name": "Symfony Community",
273
+ "homepage": "https://symfony.com/contributors"
274
+ }
275
+ ],
276
+ "description": "A generic function and convention to trigger deprecation notices",
277
+ "homepage": "https://symfony.com"
278
+ },
279
+ {
280
+ "name": "symfony/http-foundation",
281
+ "version": "v5.2.3",
282
+ "version_normalized": "5.2.3.0",
283
+ "source": {
284
+ "type": "git",
285
+ "url": "https://github.com/symfony/http-foundation.git",
286
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36"
287
+ },
288
+ "dist": {
289
+ "type": "zip",
290
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36",
291
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36",
292
+ "shasum": ""
293
+ },
294
+ "require": {
295
+ "php": ">=7.2.5",
296
+ "symfony/deprecation-contracts": "^2.1",
297
+ "symfony/polyfill-mbstring": "~1.1",
298
+ "symfony/polyfill-php80": "^1.15"
299
  },
300
  "require-dev": {
301
+ "predis/predis": "~1.0",
302
+ "symfony/cache": "^4.4|^5.0",
303
+ "symfony/expression-language": "^4.4|^5.0",
304
+ "symfony/mime": "^4.4|^5.0"
305
  },
306
  "suggest": {
307
+ "symfony/mime": "To use the file extension guesser"
308
  },
309
+ "time": "2021-02-03T04:42:09+00:00",
310
  "type": "library",
311
  "installation-source": "dist",
312
+ "autoload": {
313
+ "psr-4": {
314
+ "Symfony\\Component\\HttpFoundation\\": ""
315
+ },
316
+ "exclude-from-classmap": [
317
+ "/Tests/"
318
+ ]
319
+ },
320
  "notification-url": "https://packagist.org/downloads/",
321
  "license": [
322
  "MIT"
323
  ],
324
  "authors": [
325
  {
326
+ "name": "Fabien Potencier",
327
+ "email": "fabien@symfony.com"
328
+ },
329
+ {
330
+ "name": "Symfony Community",
331
+ "homepage": "https://symfony.com/contributors"
332
  }
333
  ],
334
+ "description": "Defines an object-oriented layer for the HTTP specification",
335
+ "homepage": "https://symfony.com"
336
+ },
337
+ {
338
+ "name": "symfony/polyfill-ctype",
339
+ "version": "v1.22.1",
340
+ "version_normalized": "1.22.1.0",
341
+ "source": {
342
+ "type": "git",
343
+ "url": "https://github.com/symfony/polyfill-ctype.git",
344
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
345
+ },
346
+ "dist": {
347
+ "type": "zip",
348
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
349
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
350
+ "shasum": ""
351
+ },
352
+ "require": {
353
+ "php": ">=7.1"
354
+ },
355
+ "suggest": {
356
+ "ext-ctype": "For best performance"
357
+ },
358
+ "time": "2021-01-07T16:49:33+00:00",
359
+ "type": "library",
360
+ "extra": {
361
+ "branch-alias": {
362
+ "dev-main": "1.22-dev"
363
+ },
364
+ "thanks": {
365
+ "name": "symfony/polyfill",
366
+ "url": "https://github.com/symfony/polyfill"
367
+ }
368
+ },
369
+ "installation-source": "dist",
370
+ "autoload": {
371
+ "psr-4": {
372
+ "Symfony\\Polyfill\\Ctype\\": ""
373
+ },
374
+ "files": [
375
+ "bootstrap.php"
376
+ ]
377
+ },
378
+ "notification-url": "https://packagist.org/downloads/",
379
+ "license": [
380
+ "MIT"
381
+ ],
382
+ "authors": [
383
+ {
384
+ "name": "Gert de Pagter",
385
+ "email": "BackEndTea@gmail.com"
386
+ },
387
+ {
388
+ "name": "Symfony Community",
389
+ "homepage": "https://symfony.com/contributors"
390
+ }
391
+ ],
392
+ "description": "Symfony polyfill for ctype functions",
393
+ "homepage": "https://symfony.com",
394
  "keywords": [
395
+ "compatibility",
396
+ "ctype",
397
  "polyfill",
398
+ "portable"
 
399
  ]
400
  },
401
  {
402
+ "name": "symfony/polyfill-intl-grapheme",
403
+ "version": "v1.22.1",
404
+ "version_normalized": "1.22.1.0",
405
  "source": {
406
  "type": "git",
407
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
408
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
409
  },
410
  "dist": {
411
  "type": "zip",
412
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
413
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
414
  "shasum": ""
415
  },
416
  "require": {
417
+ "php": ">=7.1"
418
+ },
419
+ "suggest": {
420
+ "ext-intl": "For best performance"
421
  },
422
+ "time": "2021-01-22T09:19:47+00:00",
423
  "type": "library",
424
  "extra": {
425
  "branch-alias": {
426
+ "dev-main": "1.22-dev"
427
+ },
428
+ "thanks": {
429
+ "name": "symfony/polyfill",
430
+ "url": "https://github.com/symfony/polyfill"
431
  }
432
  },
433
  "installation-source": "dist",
434
  "autoload": {
435
  "psr-4": {
436
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
437
  },
438
+ "files": [
439
+ "bootstrap.php"
440
  ]
441
  },
442
  "notification-url": "https://packagist.org/downloads/",
445
  ],
446
  "authors": [
447
  {
448
+ "name": "Nicolas Grekas",
449
+ "email": "p@tchwork.com"
450
  },
451
  {
452
  "name": "Symfony Community",
453
  "homepage": "https://symfony.com/contributors"
454
  }
455
  ],
456
+ "description": "Symfony polyfill for intl's grapheme_* functions",
457
  "homepage": "https://symfony.com",
458
  "keywords": [
459
+ "compatibility",
460
+ "grapheme",
461
+ "intl",
462
+ "polyfill",
463
+ "portable",
464
+ "shim"
465
  ]
466
  },
467
  {
468
+ "name": "symfony/polyfill-intl-normalizer",
469
+ "version": "v1.22.1",
470
+ "version_normalized": "1.22.1.0",
471
  "source": {
472
  "type": "git",
473
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
474
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
475
  },
476
  "dist": {
477
  "type": "zip",
478
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
479
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
480
  "shasum": ""
481
  },
482
  "require": {
483
+ "php": ">=7.1"
484
  },
485
  "suggest": {
486
+ "ext-intl": "For best performance"
487
  },
488
+ "time": "2021-01-22T09:19:47+00:00",
489
  "type": "library",
490
  "extra": {
491
  "branch-alias": {
492
+ "dev-main": "1.22-dev"
493
  },
494
  "thanks": {
495
  "name": "symfony/polyfill",
499
  "installation-source": "dist",
500
  "autoload": {
501
  "psr-4": {
502
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
503
  },
504
  "files": [
505
  "bootstrap.php"
506
+ ],
507
+ "classmap": [
508
+ "Resources/stubs"
509
  ]
510
  },
511
  "notification-url": "https://packagist.org/downloads/",
514
  ],
515
  "authors": [
516
  {
517
+ "name": "Nicolas Grekas",
518
+ "email": "p@tchwork.com"
519
  },
520
  {
521
  "name": "Symfony Community",
522
  "homepage": "https://symfony.com/contributors"
523
  }
524
  ],
525
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
526
  "homepage": "https://symfony.com",
527
  "keywords": [
528
  "compatibility",
529
+ "intl",
530
+ "normalizer",
531
  "polyfill",
532
+ "portable",
533
+ "shim"
534
  ]
535
  },
536
  {
537
+ "name": "symfony/polyfill-mbstring",
538
+ "version": "v1.22.1",
539
+ "version_normalized": "1.22.1.0",
540
  "source": {
541
  "type": "git",
542
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
543
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
544
  },
545
  "dist": {
546
  "type": "zip",
547
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
548
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
549
  "shasum": ""
550
  },
551
  "require": {
552
+ "php": ">=7.1"
 
553
  },
554
+ "suggest": {
555
+ "ext-mbstring": "For best performance"
556
+ },
557
+ "time": "2021-01-22T09:19:47+00:00",
558
  "type": "library",
559
  "extra": {
560
  "branch-alias": {
561
+ "dev-main": "1.22-dev"
562
  },
563
  "thanks": {
564
  "name": "symfony/polyfill",
568
  "installation-source": "dist",
569
  "autoload": {
570
  "psr-4": {
571
+ "Symfony\\Polyfill\\Mbstring\\": ""
572
+ },
573
+ "files": [
574
+ "bootstrap.php"
575
+ ]
576
+ },
577
+ "notification-url": "https://packagist.org/downloads/",
578
+ "license": [
579
+ "MIT"
580
+ ],
581
+ "authors": [
582
+ {
583
+ "name": "Nicolas Grekas",
584
+ "email": "p@tchwork.com"
585
+ },
586
+ {
587
+ "name": "Symfony Community",
588
+ "homepage": "https://symfony.com/contributors"
589
+ }
590
+ ],
591
+ "description": "Symfony polyfill for the Mbstring extension",
592
+ "homepage": "https://symfony.com",
593
+ "keywords": [
594
+ "compatibility",
595
+ "mbstring",
596
+ "polyfill",
597
+ "portable",
598
+ "shim"
599
+ ]
600
+ },
601
+ {
602
+ "name": "symfony/polyfill-php80",
603
+ "version": "v1.22.1",
604
+ "version_normalized": "1.22.1.0",
605
+ "source": {
606
+ "type": "git",
607
+ "url": "https://github.com/symfony/polyfill-php80.git",
608
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
609
+ },
610
+ "dist": {
611
+ "type": "zip",
612
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
613
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
614
+ "shasum": ""
615
+ },
616
+ "require": {
617
+ "php": ">=7.1"
618
+ },
619
+ "time": "2021-01-07T16:49:33+00:00",
620
+ "type": "library",
621
+ "extra": {
622
+ "branch-alias": {
623
+ "dev-main": "1.22-dev"
624
+ },
625
+ "thanks": {
626
+ "name": "symfony/polyfill",
627
+ "url": "https://github.com/symfony/polyfill"
628
+ }
629
+ },
630
+ "installation-source": "dist",
631
+ "autoload": {
632
+ "psr-4": {
633
+ "Symfony\\Polyfill\\Php80\\": ""
634
  },
635
  "files": [
636
  "bootstrap.php"
644
  "MIT"
645
  ],
646
  "authors": [
647
+ {
648
+ "name": "Ion Bazan",
649
+ "email": "ion.bazan@gmail.com"
650
+ },
651
  {
652
  "name": "Nicolas Grekas",
653
  "email": "p@tchwork.com"
657
  "homepage": "https://symfony.com/contributors"
658
  }
659
  ],
660
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
661
  "homepage": "https://symfony.com",
662
  "keywords": [
663
  "compatibility",
668
  },
669
  {
670
  "name": "symfony/property-access",
671
+ "version": "v5.2.3",
672
+ "version_normalized": "5.2.3.0",
673
  "source": {
674
  "type": "git",
675
  "url": "https://github.com/symfony/property-access.git",
676
+ "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3"
677
  },
678
  "dist": {
679
  "type": "zip",
680
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3",
681
+ "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3",
682
  "shasum": ""
683
  },
684
  "require": {
685
+ "php": ">=7.2.5",
686
+ "symfony/deprecation-contracts": "^2.1",
687
+ "symfony/polyfill-php80": "^1.15",
688
+ "symfony/property-info": "^5.2"
689
  },
690
  "require-dev": {
691
+ "symfony/cache": "^4.4|^5.0"
692
  },
693
  "suggest": {
694
  "psr/cache-implementation": "To cache access methods."
695
  },
696
+ "time": "2021-01-27T10:15:41+00:00",
697
  "type": "library",
 
 
 
 
 
698
  "installation-source": "dist",
699
  "autoload": {
700
  "psr-4": {
718
  "homepage": "https://symfony.com/contributors"
719
  }
720
  ],
721
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
722
  "homepage": "https://symfony.com",
723
  "keywords": [
724
  "access",
731
  "property path",
732
  "reflection"
733
  ]
734
+ },
735
+ {
736
+ "name": "symfony/property-info",
737
+ "version": "v5.2.3",
738
+ "version_normalized": "5.2.3.0",
739
+ "source": {
740
+ "type": "git",
741
+ "url": "https://github.com/symfony/property-info.git",
742
+ "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77"
743
+ },
744
+ "dist": {
745
+ "type": "zip",
746
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
747
+ "reference": "4e4f368c3737b1c175d66f4fc0b99a5bcd161a77",
748
+ "shasum": ""
749
+ },
750
+ "require": {
751
+ "php": ">=7.2.5",
752
+ "symfony/deprecation-contracts": "^2.1",
753
+ "symfony/polyfill-php80": "^1.15",
754
+ "symfony/string": "^5.1"
755
+ },
756
+ "conflict": {
757
+ "phpdocumentor/reflection-docblock": "<3.2.2",
758
+ "phpdocumentor/type-resolver": "<1.4.0",
759
+ "symfony/dependency-injection": "<4.4"
760
+ },
761
+ "require-dev": {
762
+ "doctrine/annotations": "^1.10.4",
763
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
764
+ "symfony/cache": "^4.4|^5.0",
765
+ "symfony/dependency-injection": "^4.4|^5.0",
766
+ "symfony/serializer": "^4.4|^5.0"
767
+ },
768
+ "suggest": {
769
+ "phpdocumentor/reflection-docblock": "To use the PHPDoc",
770
+ "psr/cache-implementation": "To cache results",
771
+ "symfony/doctrine-bridge": "To use Doctrine metadata",
772
+ "symfony/serializer": "To use Serializer metadata"
773
+ },
774
+ "time": "2021-01-27T10:15:41+00:00",
775
+ "type": "library",
776
+ "installation-source": "dist",
777
+ "autoload": {
778
+ "psr-4": {
779
+ "Symfony\\Component\\PropertyInfo\\": ""
780
+ },
781
+ "exclude-from-classmap": [
782
+ "/Tests/"
783
+ ]
784
+ },
785
+ "notification-url": "https://packagist.org/downloads/",
786
+ "license": [
787
+ "MIT"
788
+ ],
789
+ "authors": [
790
+ {
791
+ "name": "Kévin Dunglas",
792
+ "email": "dunglas@gmail.com"
793
+ },
794
+ {
795
+ "name": "Symfony Community",
796
+ "homepage": "https://symfony.com/contributors"
797
+ }
798
+ ],
799
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
800
+ "homepage": "https://symfony.com",
801
+ "keywords": [
802
+ "doctrine",
803
+ "phpdoc",
804
+ "property",
805
+ "symfony",
806
+ "type",
807
+ "validator"
808
+ ]
809
+ },
810
+ {
811
+ "name": "symfony/string",
812
+ "version": "v5.2.3",
813
+ "version_normalized": "5.2.3.0",
814
+ "source": {
815
+ "type": "git",
816
+ "url": "https://github.com/symfony/string.git",
817
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122"
818
+ },
819
+ "dist": {
820
+ "type": "zip",
821
+ "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
822
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122",
823
+ "shasum": ""
824
+ },
825
+ "require": {
826
+ "php": ">=7.2.5",
827
+ "symfony/polyfill-ctype": "~1.8",
828
+ "symfony/polyfill-intl-grapheme": "~1.0",
829
+ "symfony/polyfill-intl-normalizer": "~1.0",
830
+ "symfony/polyfill-mbstring": "~1.0",
831
+ "symfony/polyfill-php80": "~1.15"
832
+ },
833
+ "require-dev": {
834
+ "symfony/error-handler": "^4.4|^5.0",
835
+ "symfony/http-client": "^4.4|^5.0",
836
+ "symfony/translation-contracts": "^1.1|^2",
837
+ "symfony/var-exporter": "^4.4|^5.0"
838
+ },
839
+ "time": "2021-01-25T15:14:59+00:00",
840
+ "type": "library",
841
+ "installation-source": "dist",
842
+ "autoload": {
843
+ "psr-4": {
844
+ "Symfony\\Component\\String\\": ""
845
+ },
846
+ "files": [
847
+ "Resources/functions.php"
848
+ ],
849
+ "exclude-from-classmap": [
850
+ "/Tests/"
851
+ ]
852
+ },
853
+ "notification-url": "https://packagist.org/downloads/",
854
+ "license": [
855
+ "MIT"
856
+ ],
857
+ "authors": [
858
+ {
859
+ "name": "Nicolas Grekas",
860
+ "email": "p@tchwork.com"
861
+ },
862
+ {
863
+ "name": "Symfony Community",
864
+ "homepage": "https://symfony.com/contributors"
865
+ }
866
+ ],
867
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
868
+ "homepage": "https://symfony.com",
869
+ "keywords": [
870
+ "grapheme",
871
+ "i18n",
872
+ "string",
873
+ "unicode",
874
+ "utf-8",
875
+ "utf8"
876
+ ]
877
  }
878
  ]
vendor/geoip2/geoip2/CHANGELOG.md CHANGED
@@ -1,6 +1,34 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  2.9.0 (2018-04-10)
5
  ------------------
6
 
1
  CHANGELOG
2
  =========
3
 
4
+ 2.11.0 (2020-10-01)
5
+ -------------------
6
+
7
+ * IMPORTANT: PHP 7.2 or greater is now required.
8
+ * Added the `isResidentialProxy` property to `GeoIp2\Model\AnonymousIP` and
9
+ `GeoIp2\Record\Traits`.
10
+ * Additional type hints have been added.
11
+
12
+ 2.10.0 (2019-12-12)
13
+ -------------------
14
+
15
+ * PHP 5.6 or greater is now required.
16
+ * The `network` property was added to `GeoIp2\Record\Traits`,
17
+ `GeoIp2\Model\AnonymousIp`, `GeoIp2\Model\Asn`,
18
+ `GeoIp2\Model\ConnectionType`, `Geoip2\Model\Domain`,
19
+ and `GeoIp2\Model\Isp`. This is a string in CIDR format representing the
20
+ largest network where all of the properties besides `ipAddress` have the
21
+ same value.
22
+ * Updated documentation of anonymizer properties - `isAnonymousVpn`
23
+ and `isHostingProvider` - to be more descriptive.
24
+ * The `userCount` property was added to `GeoIp2\Record\Traits`. This is an
25
+ integer which indicates the estimated number of users sharing the
26
+ IP/network during the past 24 hours. This output is available from GeoIP2
27
+ Precision Insights.
28
+ * The `staticIpScore` property was added to `GeoIp2\Record\Traits`. This is
29
+ a float which indicates how static or dynamic an IP address is. This
30
+ output is available from GeoIP2 Precision Insights.
31
+
32
  2.9.0 (2018-04-10)
33
  ------------------
34
 
vendor/geoip2/geoip2/README.md CHANGED
@@ -3,14 +3,14 @@
3
  ## Description ##
4
 
5
  This package provides an API for the GeoIP2
6
- [web services](http://dev.maxmind.com/geoip/geoip2/web-services) and
7
- [databases](http://dev.maxmind.com/geoip/geoip2/downloadable). The API also
8
  works with the free
9
- [GeoLite2 databases](http://dev.maxmind.com/geoip/geoip2/geolite2/).
10
 
11
  ## Install via Composer ##
12
 
13
- We recommend installing this package with [Composer](http://getcomposer.org/).
14
 
15
  ### Download Composer ###
16
 
@@ -46,18 +46,18 @@ require 'vendor/autoload.php';
46
  ## Install via Phar ##
47
 
48
  Although we strongly recommend using Composer, we also provide a
49
- [phar archive](http://php.net/manual/en/book.phar.php) containing most of the
50
  dependencies for GeoIP2. Our latest phar archive is available on
51
  [our releases page](https://github.com/maxmind/GeoIP2-php/releases).
52
 
53
  ### Install Dependencies ###
54
 
55
  In order to use the phar archive, you must have the PHP
56
- [Phar extension](http://php.net/manual/en/book.phar.php) installed and
57
  enabled.
58
 
59
  If you will be making web service requests, you must have the PHP
60
- [cURL extension](http://php.net/manual/en/book.curl.php)
61
  installed to use this archive. For Debian based distributions, this can
62
  typically be found in the the `php-curl` package. For other operating
63
  systems, please consult the relevant documentation. After installing the
@@ -140,6 +140,8 @@ print($record->postal->code . "\n"); // '55455'
140
  print($record->location->latitude . "\n"); // 44.9733
141
  print($record->location->longitude . "\n"); // -93.2323
142
 
 
 
143
  ```
144
 
145
  ### Anonymous IP Example ###
@@ -157,6 +159,7 @@ $record = $reader->anonymousIp('128.101.101.101');
157
 
158
  if ($record->isAnonymous) { print "anon\n"; }
159
  print($record->ipAddress . "\n"); // '128.101.101.101'
 
160
 
161
  ```
162
 
@@ -175,6 +178,7 @@ $record = $reader->connectionType('128.101.101.101');
175
 
176
  print($record->connectionType . "\n"); // 'Corporate'
177
  print($record->ipAddress . "\n"); // '128.101.101.101'
 
178
 
179
  ```
180
 
@@ -193,6 +197,7 @@ $record = $reader->domain('128.101.101.101');
193
 
194
  print($record->domain . "\n"); // 'umn.edu'
195
  print($record->ipAddress . "\n"); // '128.101.101.101'
 
196
 
197
  ```
198
 
@@ -228,6 +233,8 @@ print($record->location->accuracyRadius . "\n"); // 50
228
  print($record->location->latitude . "\n"); // 44.9733
229
  print($record->location->longitude . "\n"); // -93.2323
230
 
 
 
231
  ```
232
 
233
  ### ISP Example ###
@@ -249,6 +256,7 @@ print($record->isp . "\n"); // 'University of Minnesota'
249
  print($record->organization . "\n"); // 'University of Minnesota'
250
 
251
  print($record->ipAddress . "\n"); // '128.101.101.101'
 
252
 
253
  ```
254
 
@@ -299,6 +307,8 @@ print($record->postal->code . "\n"); // '55455'
299
  print($record->location->latitude . "\n"); // 44.9733
300
  print($record->location->longitude . "\n"); // -93.2323
301
 
 
 
302
  ```
303
 
304
  ## Values to use for Database or Array Keys ##
@@ -326,7 +336,7 @@ Because of these factors, it is possible for any end point to return a record
326
  where some or all of the attributes are unpopulated.
327
 
328
  See the
329
- [GeoIP2 Precision web service docs](http://dev.maxmind.com/geoip/geoip2/web-services)
330
  for details on what data each end point may return.
331
 
332
  The only piece of data which is always returned is the `ipAddress`
@@ -334,7 +344,7 @@ attribute in the `GeoIp2\Record\Traits` record.
334
 
335
  ## Integration with GeoNames ##
336
 
337
- [GeoNames](http://www.geonames.org/) offers web services and downloadable
338
  databases with data on geographical features around the world, including
339
  populated places. They offer both free and paid premium data. Each
340
  feature is unique identified by a `geonameId`, which is an integer.
@@ -351,10 +361,10 @@ the GeoNames premium data set.
351
 
352
  If the problem you find is that an IP address is incorrectly mapped,
353
  please
354
- [submit your correction to MaxMind](http://www.maxmind.com/en/correction).
355
 
356
  If you find some other sort of mistake, like an incorrect spelling,
357
- please check the [GeoNames site](http://www.geonames.org/) first. Once
358
  you've searched for a place and found it on the GeoNames map view, there
359
  are a number of links you can use to correct data ("move", "edit",
360
  "alternate names", etc.). Once the correction is part of the GeoNames
@@ -363,7 +373,7 @@ releases.
363
 
364
  If you are a paying MaxMind customer and you're not sure where to submit
365
  a correction, please
366
- [contact MaxMind support](http://www.maxmind.com/en/support) for help.
367
 
368
  ## Other Support ##
369
 
@@ -372,12 +382,11 @@ Please report all issues with this code using the
372
 
373
  If you are having an issue with a MaxMind service that is not specific
374
  to the client API, please see
375
- [our support page](http://www.maxmind.com/en/support).
376
 
377
  ## Requirements ##
378
 
379
- This library requires PHP 5.4 or greater. This library works and is tested
380
- with HHVM.
381
 
382
  This library also relies on the [MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-php).
383
 
@@ -391,11 +400,10 @@ https://github.com/maxmind/MaxMind-DB
391
 
392
  ## Versioning ##
393
 
394
- The GeoIP2 PHP API uses [Semantic Versioning](http://semver.org/).
395
 
396
  ## Copyright and License ##
397
 
398
  This software is Copyright (c) 2013-2019 by MaxMind, Inc.
399
 
400
  This is free software, licensed under the Apache License, Version 2.0.
401
-
3
  ## Description ##
4
 
5
  This package provides an API for the GeoIP2
6
+ [web services](https://dev.maxmind.com/geoip/geoip2/web-services) and
7
+ [databases](https://dev.maxmind.com/geoip/geoip2/downloadable). The API also
8
  works with the free
9
+ [GeoLite2 databases](https://dev.maxmind.com/geoip/geoip2/geolite2/).
10
 
11
  ## Install via Composer ##
12
 
13
+ We recommend installing this package with [Composer](https://getcomposer.org/).
14
 
15
  ### Download Composer ###
16
 
46
  ## Install via Phar ##
47
 
48
  Although we strongly recommend using Composer, we also provide a
49
+ [phar archive](https://php.net/manual/en/book.phar.php) containing most of the
50
  dependencies for GeoIP2. Our latest phar archive is available on
51
  [our releases page](https://github.com/maxmind/GeoIP2-php/releases).
52
 
53
  ### Install Dependencies ###
54
 
55
  In order to use the phar archive, you must have the PHP
56
+ [Phar extension](https://php.net/manual/en/book.phar.php) installed and
57
  enabled.
58
 
59
  If you will be making web service requests, you must have the PHP
60
+ [cURL extension](https://php.net/manual/en/book.curl.php)
61
  installed to use this archive. For Debian based distributions, this can
62
  typically be found in the the `php-curl` package. For other operating
63
  systems, please consult the relevant documentation. After installing the
140
  print($record->location->latitude . "\n"); // 44.9733
141
  print($record->location->longitude . "\n"); // -93.2323
142
 
143
+ print($record->traits->network . "\n"); // '128.101.101.101/32'
144
+
145
  ```
146
 
147
  ### Anonymous IP Example ###
159
 
160
  if ($record->isAnonymous) { print "anon\n"; }
161
  print($record->ipAddress . "\n"); // '128.101.101.101'
162
+ print($record->network . "\n"); // '128.101.101.101/32'
163
 
164
  ```
165
 
178
 
179
  print($record->connectionType . "\n"); // 'Corporate'
180
  print($record->ipAddress . "\n"); // '128.101.101.101'
181
+ print($record->network . "\n"); // '128.101.101.101/32'
182
 
183
  ```
184
 
197
 
198
  print($record->domain . "\n"); // 'umn.edu'
199
  print($record->ipAddress . "\n"); // '128.101.101.101'
200
+ print($record->network . "\n"); // '128.101.101.101/32'
201
 
202
  ```
203
 
233
  print($record->location->latitude . "\n"); // 44.9733
234
  print($record->location->longitude . "\n"); // -93.2323
235
 
236
+ print($record->traits->network . "\n"); // '128.101.101.101/32'
237
+
238
  ```
239
 
240
  ### ISP Example ###
256
  print($record->organization . "\n"); // 'University of Minnesota'
257
 
258
  print($record->ipAddress . "\n"); // '128.101.101.101'
259
+ print($record->network . "\n"); // '128.101.101.101/32'
260
 
261
  ```
262
 
307
  print($record->location->latitude . "\n"); // 44.9733
308
  print($record->location->longitude . "\n"); // -93.2323
309
 
310
+ print($record->traits->network . "\n"); // '128.101.101.101/32'
311
+
312
  ```
313
 
314
  ## Values to use for Database or Array Keys ##
336
  where some or all of the attributes are unpopulated.
337
 
338
  See the
339
+ [GeoIP2 Precision web service docs](https://dev.maxmind.com/geoip/geoip2/web-services)
340
  for details on what data each end point may return.
341
 
342
  The only piece of data which is always returned is the `ipAddress`
344
 
345
  ## Integration with GeoNames ##
346
 
347
+ [GeoNames](https://www.geonames.org/) offers web services and downloadable
348
  databases with data on geographical features around the world, including
349
  populated places. They offer both free and paid premium data. Each
350
  feature is unique identified by a `geonameId`, which is an integer.
361
 
362
  If the problem you find is that an IP address is incorrectly mapped,
363
  please
364
+ [submit your correction to MaxMind](https://www.maxmind.com/en/correction).
365
 
366
  If you find some other sort of mistake, like an incorrect spelling,
367
+ please check the [GeoNames site](https://www.geonames.org/) first. Once
368
  you've searched for a place and found it on the GeoNames map view, there
369
  are a number of links you can use to correct data ("move", "edit",
370
  "alternate names", etc.). Once the correction is part of the GeoNames
373
 
374
  If you are a paying MaxMind customer and you're not sure where to submit
375
  a correction, please
376
+ [contact MaxMind support](https://www.maxmind.com/en/support) for help.
377
 
378
  ## Other Support ##
379
 
382
 
383
  If you are having an issue with a MaxMind service that is not specific
384
  to the client API, please see
385
+ [our support page](https://www.maxmind.com/en/support).
386
 
387
  ## Requirements ##
388
 
389
+ This library requires PHP 5.6 or greater.
 
390
 
391
  This library also relies on the [MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-php).
392
 
400
 
401
  ## Versioning ##
402
 
403
+ The GeoIP2 PHP API uses [Semantic Versioning](https://semver.org/).
404
 
405
  ## Copyright and License ##
406
 
407
  This software is Copyright (c) 2013-2019 by MaxMind, Inc.
408
 
409
  This is free software, licensed under the Apache License, Version 2.0.
 
vendor/geoip2/geoip2/composer.json CHANGED
@@ -9,17 +9,18 @@
9
  {
10
  "name": "Gregory J. Oschwald",
11
  "email": "goschwald@maxmind.com",
12
- "homepage": "http://www.maxmind.com/"
13
  }
14
  ],
15
  "require": {
16
- "maxmind-db/reader": "~1.0",
17
- "maxmind/web-service-common": "~0.5",
18
- "php": ">=5.4"
 
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
- "phpunit/phpunit": "4.*",
23
  "squizlabs/php_codesniffer": "3.*"
24
  },
25
  "autoload": {
9
  {
10
  "name": "Gregory J. Oschwald",
11
  "email": "goschwald@maxmind.com",
12
+ "homepage": "https://www.maxmind.com/"
13
  }
14
  ],
15
  "require": {
16
+ "maxmind-db/reader": "~1.8",
17
+ "maxmind/web-service-common": "~0.8",
18
+ "php": ">=7.2",
19
+ "ext-json": "*"
20
  },
21
  "require-dev": {
22
  "friendsofphp/php-cs-fixer": "2.*",
23
+ "phpunit/phpunit": "^8.0 || ^9.0",
24
  "squizlabs/php_codesniffer": "3.*"
25
  },
26
  "autoload": {
vendor/geoip2/geoip2/src/Database/Reader.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Database;
4
 
5
  use GeoIp2\Exception\AddressNotFoundException;
@@ -34,6 +36,7 @@ use MaxMind\Db\Reader\InvalidDatabaseException;
34
  class Reader implements ProviderInterface
35
  {
36
  private $dbReader;
 
37
  private $locales;
38
 
39
  /**
@@ -47,10 +50,11 @@ class Reader implements ProviderInterface
47
  * is corrupt or invalid
48
  */
49
  public function __construct(
50
- $filename,
51
- $locales = ['en']
52
  ) {
53
  $this->dbReader = new DbReader($filename);
 
54
  $this->locales = $locales;
55
  }
56
 
@@ -63,10 +67,8 @@ class Reader implements ProviderInterface
63
  * not in the database
64
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
65
  * is corrupt or invalid
66
- *
67
- * @return \GeoIp2\Model\City
68
  */
69
- public function city($ipAddress)
70
  {
71
  return $this->modelFor('City', 'City', $ipAddress);
72
  }
@@ -80,10 +82,8 @@ class Reader implements ProviderInterface
80
  * not in the database
81
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
82
  * is corrupt or invalid
83
- *
84
- * @return \GeoIp2\Model\Country
85
  */
86
- public function country($ipAddress)
87
  {
88
  return $this->modelFor('Country', 'Country', $ipAddress);
89
  }
@@ -97,10 +97,8 @@ class Reader implements ProviderInterface
97
  * not in the database
98
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
99
  * is corrupt or invalid
100
- *
101
- * @return \GeoIp2\Model\AnonymousIp
102
  */
103
- public function anonymousIp($ipAddress)
104
  {
105
  return $this->flatModelFor(
106
  'AnonymousIp',
@@ -118,10 +116,8 @@ class Reader implements ProviderInterface
118
  * not in the database
119
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
120
  * is corrupt or invalid
121
- *
122
- * @return \GeoIp2\Model\Asn
123
  */
124
- public function asn($ipAddress)
125
  {
126
  return $this->flatModelFor(
127
  'Asn',
@@ -139,10 +135,8 @@ class Reader implements ProviderInterface
139
  * not in the database
140
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
141
  * is corrupt or invalid
142
- *
143
- * @return \GeoIp2\Model\ConnectionType
144
  */
145
- public function connectionType($ipAddress)
146
  {
147
  return $this->flatModelFor(
148
  'ConnectionType',
@@ -160,10 +154,8 @@ class Reader implements ProviderInterface
160
  * not in the database
161
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
162
  * is corrupt or invalid
163
- *
164
- * @return \GeoIp2\Model\Domain
165
  */
166
- public function domain($ipAddress)
167
  {
168
  return $this->flatModelFor(
169
  'Domain',
@@ -181,10 +173,8 @@ class Reader implements ProviderInterface
181
  * not in the database
182
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
183
  * is corrupt or invalid
184
- *
185
- * @return \GeoIp2\Model\Enterprise
186
  */
187
- public function enterprise($ipAddress)
188
  {
189
  return $this->modelFor('Enterprise', 'Enterprise', $ipAddress);
190
  }
@@ -198,10 +188,8 @@ class Reader implements ProviderInterface
198
  * not in the database
199
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
200
  * is corrupt or invalid
201
- *
202
- * @return \GeoIp2\Model\Isp
203
  */
204
- public function isp($ipAddress)
205
  {
206
  return $this->flatModelFor(
207
  'Isp',
@@ -210,42 +198,44 @@ class Reader implements ProviderInterface
210
  );
211
  }
212
 
213
- private function modelFor($class, $type, $ipAddress)
214
  {
215
- $record = $this->getRecord($class, $type, $ipAddress);
216
 
217
  $record['traits']['ip_address'] = $ipAddress;
 
 
218
  $class = 'GeoIp2\\Model\\' . $class;
219
 
220
  return new $class($record, $this->locales);
221
  }
222
 
223
- private function flatModelFor($class, $type, $ipAddress)
224
  {
225
- $record = $this->getRecord($class, $type, $ipAddress);
226
 
227
  $record['ip_address'] = $ipAddress;
 
228
  $class = 'GeoIp2\\Model\\' . $class;
229
 
230
  return new $class($record);
231
  }
232
 
233
- private function getRecord($class, $type, $ipAddress)
234
  {
235
- if (strpos($this->metadata()->databaseType, $type) === false) {
236
  $method = lcfirst($class);
237
  throw new \BadMethodCallException(
238
- "The $method method cannot be used to open a "
239
- . $this->metadata()->databaseType . ' database'
240
  );
241
  }
242
- $record = $this->dbReader->get($ipAddress);
243
  if ($record === null) {
244
  throw new AddressNotFoundException(
245
  "The address $ipAddress is not in the database."
246
  );
247
  }
248
- if (!is_array($record)) {
249
  // This can happen on corrupt databases. Generally,
250
  // MaxMind\Db\Reader will throw a
251
  // MaxMind\Db\Reader\InvalidDatabaseException, but occasionally
@@ -255,11 +245,11 @@ class Reader implements ProviderInterface
255
  // exceptions go unnoticed.
256
  throw new InvalidDatabaseException(
257
  "Expected an array when looking up $ipAddress but received: "
258
- . gettype($record)
259
  );
260
  }
261
 
262
- return $record;
263
  }
264
 
265
  /**
@@ -268,7 +258,7 @@ class Reader implements ProviderInterface
268
  *
269
  * @return \MaxMind\Db\Reader\Metadata object for the database
270
  */
271
- public function metadata()
272
  {
273
  return $this->dbReader->metadata();
274
  }
@@ -276,7 +266,7 @@ class Reader implements ProviderInterface
276
  /**
277
  * Closes the GeoIP2 database and returns the resources to the system.
278
  */
279
- public function close()
280
  {
281
  $this->dbReader->close();
282
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Database;
6
 
7
  use GeoIp2\Exception\AddressNotFoundException;
36
  class Reader implements ProviderInterface
37
  {
38
  private $dbReader;
39
+ private $dbType;
40
  private $locales;
41
 
42
  /**
50
  * is corrupt or invalid
51
  */
52
  public function __construct(
53
+ string $filename,
54
+ array $locales = ['en']
55
  ) {
56
  $this->dbReader = new DbReader($filename);
57
+ $this->dbType = $this->dbReader->metadata()->databaseType;
58
  $this->locales = $locales;
59
  }
60
 
67
  * not in the database
68
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
69
  * is corrupt or invalid
 
 
70
  */
71
+ public function city(string $ipAddress): \GeoIp2\Model\City
72
  {
73
  return $this->modelFor('City', 'City', $ipAddress);
74
  }
82
  * not in the database
83
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
84
  * is corrupt or invalid
 
 
85
  */
86
+ public function country(string $ipAddress): \GeoIp2\Model\Country
87
  {
88
  return $this->modelFor('Country', 'Country', $ipAddress);
89
  }
97
  * not in the database
98
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
99
  * is corrupt or invalid
 
 
100
  */
101
+ public function anonymousIp(string $ipAddress): \GeoIp2\Model\AnonymousIp
102
  {
103
  return $this->flatModelFor(
104
  'AnonymousIp',
116
  * not in the database
117
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
118
  * is corrupt or invalid
 
 
119
  */
120
+ public function asn(string $ipAddress): \GeoIp2\Model\Asn
121
  {
122
  return $this->flatModelFor(
123
  'Asn',
135
  * not in the database
136
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
137
  * is corrupt or invalid
 
 
138
  */
139
+ public function connectionType(string $ipAddress): \GeoIp2\Model\ConnectionType
140
  {
141
  return $this->flatModelFor(
142
  'ConnectionType',
154
  * not in the database
155
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
156
  * is corrupt or invalid
 
 
157
  */
158
+ public function domain(string $ipAddress): \GeoIp2\Model\Domain
159
  {
160
  return $this->flatModelFor(
161
  'Domain',
173
  * not in the database
174
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
175
  * is corrupt or invalid
 
 
176
  */
177
+ public function enterprise(string $ipAddress): \GeoIp2\Model\Enterprise
178
  {
179
  return $this->modelFor('Enterprise', 'Enterprise', $ipAddress);
180
  }
188
  * not in the database
189
  * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
190
  * is corrupt or invalid
 
 
191
  */
192
+ public function isp(string $ipAddress): \GeoIp2\Model\Isp
193
  {
194
  return $this->flatModelFor(
195
  'Isp',
198
  );
199
  }
200
 
201
+ private function modelFor(string $class, string $type, string $ipAddress)
202
  {
203
+ list($record, $prefixLen) = $this->getRecord($class, $type, $ipAddress);
204
 
205
  $record['traits']['ip_address'] = $ipAddress;
206
+ $record['traits']['prefix_len'] = $prefixLen;
207
+
208
  $class = 'GeoIp2\\Model\\' . $class;
209
 
210
  return new $class($record, $this->locales);
211
  }
212
 
213
+ private function flatModelFor(string $class, string $type, string $ipAddress)
214
  {
215
+ list($record, $prefixLen) = $this->getRecord($class, $type, $ipAddress);
216
 
217
  $record['ip_address'] = $ipAddress;
218
+ $record['prefix_len'] = $prefixLen;
219
  $class = 'GeoIp2\\Model\\' . $class;
220
 
221
  return new $class($record);
222
  }
223
 
224
+ private function getRecord(string $class, string $type, string $ipAddress): array
225
  {
226
+ if (strpos($this->dbType, $type) === false) {
227
  $method = lcfirst($class);
228
  throw new \BadMethodCallException(
229
+ "The $method method cannot be used to open a {$this->dbType} database"
 
230
  );
231
  }
232
+ list($record, $prefixLen) = $this->dbReader->getWithPrefixLen($ipAddress);
233
  if ($record === null) {
234
  throw new AddressNotFoundException(
235
  "The address $ipAddress is not in the database."
236
  );
237
  }
238
+ if (!\is_array($record)) {
239
  // This can happen on corrupt databases. Generally,
240
  // MaxMind\Db\Reader will throw a
241
  // MaxMind\Db\Reader\InvalidDatabaseException, but occasionally
245
  // exceptions go unnoticed.
246
  throw new InvalidDatabaseException(
247
  "Expected an array when looking up $ipAddress but received: "
248
+ . \gettype($record)
249
  );
250
  }
251
 
252
+ return [$record, $prefixLen];
253
  }
254
 
255
  /**
258
  *
259
  * @return \MaxMind\Db\Reader\Metadata object for the database
260
  */
261
+ public function metadata(): \MaxMind\Db\Reader\Metadata
262
  {
263
  return $this->dbReader->metadata();
264
  }
266
  /**
267
  * Closes the GeoIP2 database and returns the resources to the system.
268
  */
269
+ public function close(): void
270
  {
271
  $this->dbReader->close();
272
  }
vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
vendor/geoip2/geoip2/src/Exception/AuthenticationException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
vendor/geoip2/geoip2/src/Exception/HttpException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
@@ -13,9 +15,9 @@ class HttpException extends GeoIp2Exception
13
  public $uri;
14
 
15
  public function __construct(
16
- $message,
17
- $httpStatus,
18
- $uri,
19
  \Exception $previous = null
20
  ) {
21
  $this->uri = $uri;
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
15
  public $uri;
16
 
17
  public function __construct(
18
+ string $message,
19
+ int $httpStatus,
20
+ string $uri,
21
  \Exception $previous = null
22
  ) {
23
  $this->uri = $uri;
vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
@@ -14,10 +16,10 @@ class InvalidRequestException extends HttpException
14
  public $error;
15
 
16
  public function __construct(
17
- $message,
18
- $error,
19
- $httpStatus,
20
- $uri,
21
  \Exception $previous = null
22
  ) {
23
  $this->error = $error;
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
16
  public $error;
17
 
18
  public function __construct(
19
+ string $message,
20
+ string $error,
21
+ int $httpStatus,
22
+ string $uri,
23
  \Exception $previous = null
24
  ) {
25
  $this->error = $error;
vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Exception;
6
 
7
  /**
vendor/geoip2/geoip2/src/Model/AbstractModel.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
5
  /**
@@ -11,20 +13,16 @@ abstract class AbstractModel implements \JsonSerializable
11
 
12
  /**
13
  * @ignore
14
- *
15
- * @param mixed $raw
16
  */
17
- public function __construct($raw)
18
  {
19
  $this->raw = $raw;
20
  }
21
 
22
  /**
23
  * @ignore
24
- *
25
- * @param mixed $field
26
  */
27
- protected function get($field)
28
  {
29
  if (isset($this->raw[$field])) {
30
  return $this->raw[$field];
@@ -38,10 +36,8 @@ abstract class AbstractModel implements \JsonSerializable
38
 
39
  /**
40
  * @ignore
41
- *
42
- * @param mixed $attr
43
  */
44
- public function __get($attr)
45
  {
46
  if ($attr !== 'instance' && property_exists($this, $attr)) {
47
  return $this->$attr;
@@ -52,15 +48,13 @@ abstract class AbstractModel implements \JsonSerializable
52
 
53
  /**
54
  * @ignore
55
- *
56
- * @param mixed $attr
57
  */
58
- public function __isset($attr)
59
  {
60
  return $attr !== 'instance' && isset($this->$attr);
61
  }
62
 
63
- public function jsonSerialize()
64
  {
65
  return $this->raw;
66
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
  /**
13
 
14
  /**
15
  * @ignore
 
 
16
  */
17
+ public function __construct(array $raw)
18
  {
19
  $this->raw = $raw;
20
  }
21
 
22
  /**
23
  * @ignore
 
 
24
  */
25
+ protected function get(string $field)
26
  {
27
  if (isset($this->raw[$field])) {
28
  return $this->raw[$field];
36
 
37
  /**
38
  * @ignore
 
 
39
  */
40
+ public function __get(string $attr)
41
  {
42
  if ($attr !== 'instance' && property_exists($this, $attr)) {
43
  return $this->$attr;
48
 
49
  /**
50
  * @ignore
 
 
51
  */
52
+ public function __isset(string $attr): bool
53
  {
54
  return $attr !== 'instance' && isset($this->$attr);
55
  }
56
 
57
+ public function jsonSerialize(): array
58
  {
59
  return $this->raw;
60
  }
vendor/geoip2/geoip2/src/Model/AnonymousIp.php CHANGED
@@ -1,22 +1,33 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
 
 
5
  /**
6
  * This class provides the GeoIP2 Anonymous IP model.
7
  *
8
  * @property-read bool $isAnonymous This is true if the IP address belongs to
9
  * any sort of anonymous network.
10
- * @property-read bool $isAnonymousVpn This is true if the IP address belongs to
11
- * an anonymous VPN system.
 
 
12
  * @property-read bool $isHostingProvider This is true if the IP address belongs
13
- * to a hosting provider.
14
  * @property-read bool $isPublicProxy This is true if the IP address belongs to
15
  * a public proxy.
 
 
16
  * @property-read bool $isTorExitNode This is true if the IP address is a Tor
17
  * exit node.
18
  * @property-read string $ipAddress The IP address that the data in the model is
19
  * for.
 
 
 
20
  */
21
  class AnonymousIp extends AbstractModel
22
  {
@@ -24,15 +35,15 @@ class AnonymousIp extends AbstractModel
24
  protected $isAnonymousVpn;
25
  protected $isHostingProvider;
26
  protected $isPublicProxy;
 
27
  protected $isTorExitNode;
28
  protected $ipAddress;
 
29
 
30
  /**
31
  * @ignore
32
- *
33
- * @param mixed $raw
34
  */
35
- public function __construct($raw)
36
  {
37
  parent::__construct($raw);
38
 
@@ -40,7 +51,10 @@ class AnonymousIp extends AbstractModel
40
  $this->isAnonymousVpn = $this->get('is_anonymous_vpn');
41
  $this->isHostingProvider = $this->get('is_hosting_provider');
42
  $this->isPublicProxy = $this->get('is_public_proxy');
 
43
  $this->isTorExitNode = $this->get('is_tor_exit_node');
44
- $this->ipAddress = $this->get('ip_address');
 
 
45
  }
46
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * This class provides the GeoIP2 Anonymous IP model.
11
  *
12
  * @property-read bool $isAnonymous This is true if the IP address belongs to
13
  * any sort of anonymous network.
14
+ * @property-read bool $isAnonymousVpn This is true if the IP address is
15
+ * registered to an anonymous VPN provider. If a VPN provider does not
16
+ * register subnets under names associated with them, we will likely only
17
+ * flag their IP ranges using the isHostingProvider property.
18
  * @property-read bool $isHostingProvider This is true if the IP address belongs
19
+ * to a hosting or VPN provider (see description of isAnonymousVpn property).
20
  * @property-read bool $isPublicProxy This is true if the IP address belongs to
21
  * a public proxy.
22
+ * @property-read bool $isResidentialProxy This is true if the IP address is
23
+ * on a suspected anonymizing network and belongs to a residential ISP.
24
  * @property-read bool $isTorExitNode This is true if the IP address is a Tor
25
  * exit node.
26
  * @property-read string $ipAddress The IP address that the data in the model is
27
  * for.
28
+ * @property-read string $network The network in CIDR notation associated with
29
+ * the record. In particular, this is the largest network where all of the
30
+ * fields besides $ipAddress have the same value.
31
  */
32
  class AnonymousIp extends AbstractModel
33
  {
35
  protected $isAnonymousVpn;
36
  protected $isHostingProvider;
37
  protected $isPublicProxy;
38
+ protected $isResidentialProxy;
39
  protected $isTorExitNode;
40
  protected $ipAddress;
41
+ protected $network;
42
 
43
  /**
44
  * @ignore
 
 
45
  */
46
+ public function __construct(array $raw)
47
  {
48
  parent::__construct($raw);
49
 
51
  $this->isAnonymousVpn = $this->get('is_anonymous_vpn');
52
  $this->isHostingProvider = $this->get('is_hosting_provider');
53
  $this->isPublicProxy = $this->get('is_public_proxy');
54
+ $this->isResidentialProxy = $this->get('is_residential_proxy');
55
  $this->isTorExitNode = $this->get('is_tor_exit_node');
56
+ $ipAddress = $this->get('ip_address');
57
+ $this->ipAddress = $ipAddress;
58
+ $this->network = Util::cidr($ipAddress, $this->get('prefix_len'));
59
  }
60
  }
vendor/geoip2/geoip2/src/Model/Asn.php CHANGED
@@ -1,7 +1,11 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
 
 
5
  /**
6
  * This class provides the GeoLite2 ASN model.
7
  *
@@ -12,24 +16,28 @@ namespace GeoIp2\Model;
12
  * address.
13
  * @property-read string $ipAddress The IP address that the data in the model is
14
  * for.
 
 
 
15
  */
16
  class Asn extends AbstractModel
17
  {
18
  protected $autonomousSystemNumber;
19
  protected $autonomousSystemOrganization;
20
  protected $ipAddress;
 
21
 
22
  /**
23
  * @ignore
24
- *
25
- * @param mixed $raw
26
  */
27
- public function __construct($raw)
28
  {
29
  parent::__construct($raw);
30
  $this->autonomousSystemNumber = $this->get('autonomous_system_number');
31
  $this->autonomousSystemOrganization =
32
  $this->get('autonomous_system_organization');
33
- $this->ipAddress = $this->get('ip_address');
 
 
34
  }
35
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * This class provides the GeoLite2 ASN model.
11
  *
16
  * address.
17
  * @property-read string $ipAddress The IP address that the data in the model is
18
  * for.
19
+ * @property-read string $network The network in CIDR notation associated with
20
+ * the record. In particular, this is the largest network where all of the
21
+ * fields besides $ipAddress have the same value.
22
  */
23
  class Asn extends AbstractModel
24
  {
25
  protected $autonomousSystemNumber;
26
  protected $autonomousSystemOrganization;
27
  protected $ipAddress;
28
+ protected $network;
29
 
30
  /**
31
  * @ignore
 
 
32
  */
33
+ public function __construct(array $raw)
34
  {
35
  parent::__construct($raw);
36
  $this->autonomousSystemNumber = $this->get('autonomous_system_number');
37
  $this->autonomousSystemOrganization =
38
  $this->get('autonomous_system_organization');
39
+ $ipAddress = $this->get('ip_address');
40
+ $this->ipAddress = $ipAddress;
41
+ $this->network = Util::cidr($ipAddress, $this->get('prefix_len'));
42
  }
43
  }
vendor/geoip2/geoip2/src/Model/City.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
5
  /**
@@ -7,42 +9,25 @@ namespace GeoIp2\Model;
7
  *
8
  * The only difference between the City and Insights model classes is which
9
  * fields in each record may be populated. See
10
- * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
  *
12
  * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
  * address.
14
- * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
- * requested IP address.
16
- * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
- * IP address. This object represents the country where MaxMind believes the
18
- * end user is located.
19
  * @property-read \GeoIp2\Record\Location $location Location data for the
20
  * requested IP address.
21
  * @property-read \GeoIp2\Record\Postal $postal Postal data for the
22
  * requested IP address.
23
- * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
24
- * account.
25
- * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
26
- * data for the requested IP address. This record represents the country
27
- * where the ISP has registered a given IP block and may differ from the
28
- * user's country.
29
- * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
30
- * Represented country data for the requested IP address. The represented
31
- * country is used for things like military bases. It is only present when
32
- * the represented country differs from the country.
33
- * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
34
  * objects representing the country subdivisions for the requested IP
35
  * address. The number and type of subdivisions varies by country, but a
36
  * subdivision is typically a state, province, county, etc. Subdivisions
37
  * are ordered from most general (largest) to most specific (smallest).
38
  * If the response did not contain any subdivisions, this method returns
39
  * an empty array.
40
- * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
41
  * representing the most specific subdivision returned. If the response
42
  * did not contain any subdivisions, this method returns an empty
43
- * {@link \GeoIp2\Record\Subdivision} object.
44
- * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
45
- * requested IP address.
46
  */
47
  class City extends Country
48
  {
@@ -65,11 +50,8 @@ class City extends Country
65
 
66
  /**
67
  * @ignore
68
- *
69
- * @param mixed $raw
70
- * @param mixed $locales
71
  */
72
- public function __construct($raw, $locales = ['en'])
73
  {
74
  parent::__construct($raw, $locales);
75
 
@@ -80,7 +62,7 @@ class City extends Country
80
  $this->createSubdivisions($raw, $locales);
81
  }
82
 
83
- private function createSubdivisions($raw, $locales)
84
  {
85
  if (!isset($raw['subdivisions'])) {
86
  return;
@@ -96,10 +78,8 @@ class City extends Country
96
 
97
  /**
98
  * @ignore
99
- *
100
- * @param mixed $attr
101
  */
102
- public function __get($attr)
103
  {
104
  if ($attr === 'mostSpecificSubdivision') {
105
  return $this->$attr();
@@ -110,10 +90,8 @@ class City extends Country
110
 
111
  /**
112
  * @ignore
113
- *
114
- * @param mixed $attr
115
  */
116
- public function __isset($attr)
117
  {
118
  if ($attr === 'mostSpecificSubdivision') {
119
  // We always return a mostSpecificSubdivision, even if it is the
@@ -124,7 +102,7 @@ class City extends Country
124
  return parent::__isset($attr);
125
  }
126
 
127
- private function mostSpecificSubdivision()
128
  {
129
  return empty($this->subdivisions) ?
130
  new \GeoIp2\Record\Subdivision([], $this->locales) :
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
  /**
9
  *
10
  * The only difference between the City and Insights model classes is which
11
  * fields in each record may be populated. See
12
+ * https://dev.maxmind.com/geoip/geoip2/web-services for more details.
13
  *
14
  * @property-read \GeoIp2\Record\City $city City data for the requested IP
15
  * address.
 
 
 
 
 
16
  * @property-read \GeoIp2\Record\Location $location Location data for the
17
  * requested IP address.
18
  * @property-read \GeoIp2\Record\Postal $postal Postal data for the
19
  * requested IP address.
20
+ * @property-read array $subdivisions An array \GeoIp2\Record\Subdivision
 
 
 
 
 
 
 
 
 
 
21
  * objects representing the country subdivisions for the requested IP
22
  * address. The number and type of subdivisions varies by country, but a
23
  * subdivision is typically a state, province, county, etc. Subdivisions
24
  * are ordered from most general (largest) to most specific (smallest).
25
  * If the response did not contain any subdivisions, this method returns
26
  * an empty array.
27
+ * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
28
  * representing the most specific subdivision returned. If the response
29
  * did not contain any subdivisions, this method returns an empty
30
+ * \GeoIp2\Record\Subdivision object.
 
 
31
  */
32
  class City extends Country
33
  {
50
 
51
  /**
52
  * @ignore
 
 
 
53
  */
54
+ public function __construct(array $raw, array $locales = ['en'])
55
  {
56
  parent::__construct($raw, $locales);
57
 
62
  $this->createSubdivisions($raw, $locales);
63
  }
64
 
65
+ private function createSubdivisions(array $raw, array $locales): void
66
  {
67
  if (!isset($raw['subdivisions'])) {
68
  return;
78
 
79
  /**
80
  * @ignore
 
 
81
  */
82
+ public function __get(string $attr)
83
  {
84
  if ($attr === 'mostSpecificSubdivision') {
85
  return $this->$attr();
90
 
91
  /**
92
  * @ignore
 
 
93
  */
94
+ public function __isset(string $attr): bool
95
  {
96
  if ($attr === 'mostSpecificSubdivision') {
97
  // We always return a mostSpecificSubdivision, even if it is the
102
  return parent::__isset($attr);
103
  }
104
 
105
+ private function mostSpecificSubdivision(): \GeoIp2\Record\Subdivision
106
  {
107
  return empty($this->subdivisions) ?
108
  new \GeoIp2\Record\Subdivision([], $this->locales) :
vendor/geoip2/geoip2/src/Model/ConnectionType.php CHANGED
@@ -1,7 +1,11 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
 
 
5
  /**
6
  * This class provides the GeoIP2 Connection-Type model.
7
  *
@@ -10,22 +14,26 @@ namespace GeoIp2\Model;
10
  * Additional values may be added in the future.
11
  * @property-read string $ipAddress The IP address that the data in the model is
12
  * for.
 
 
 
13
  */
14
  class ConnectionType extends AbstractModel
15
  {
16
  protected $connectionType;
17
  protected $ipAddress;
 
18
 
19
  /**
20
  * @ignore
21
- *
22
- * @param mixed $raw
23
  */
24
- public function __construct($raw)
25
  {
26
  parent::__construct($raw);
27
 
28
  $this->connectionType = $this->get('connection_type');
29
- $this->ipAddress = $this->get('ip_address');
 
 
30
  }
31
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * This class provides the GeoIP2 Connection-Type model.
11
  *
14
  * Additional values may be added in the future.
15
  * @property-read string $ipAddress The IP address that the data in the model is
16
  * for.
17
+ * @property-read string $network The network in CIDR notation associated with
18
+ * the record. In particular, this is the largest network where all of the
19
+ * fields besides $ipAddress have the same value.
20
  */
21
  class ConnectionType extends AbstractModel
22
  {
23
  protected $connectionType;
24
  protected $ipAddress;
25
+ protected $network;
26
 
27
  /**
28
  * @ignore
 
 
29
  */
30
+ public function __construct(array $raw)
31
  {
32
  parent::__construct($raw);
33
 
34
  $this->connectionType = $this->get('connection_type');
35
+ $ipAddress = $this->get('ip_address');
36
+ $this->ipAddress = $ipAddress;
37
+ $this->network = Util::cidr($ipAddress, $this->get('prefix_len'));
38
  }
39
  }
vendor/geoip2/geoip2/src/Model/Country.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
5
  /**
@@ -7,7 +9,7 @@ namespace GeoIp2\Model;
7
  *
8
  * The only difference between the City and Insights model classes is which
9
  * fields in each record may be populated. See
10
- * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
  *
12
  * @property-read \GeoIp2\Record\Continent $continent Continent data for the
13
  * requested IP address.
@@ -39,11 +41,8 @@ class Country extends AbstractModel
39
 
40
  /**
41
  * @ignore
42
- *
43
- * @param mixed $raw
44
- * @param mixed $locales
45
  */
46
- public function __construct($raw, $locales = ['en'])
47
  {
48
  parent::__construct($raw);
49
 
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
  /**
9
  *
10
  * The only difference between the City and Insights model classes is which
11
  * fields in each record may be populated. See
12
+ * https://dev.maxmind.com/geoip/geoip2/web-services for more details.
13
  *
14
  * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
  * requested IP address.
41
 
42
  /**
43
  * @ignore
 
 
 
44
  */
45
+ public function __construct(array $raw, array $locales = ['en'])
46
  {
47
  parent::__construct($raw);
48
 
vendor/geoip2/geoip2/src/Model/Domain.php CHANGED
@@ -1,7 +1,11 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
 
 
5
  /**
6
  * This class provides the GeoIP2 Domain model.
7
  *
@@ -10,22 +14,26 @@ namespace GeoIp2\Model;
10
  * "example.co.uk", not "foo.example.com".
11
  * @property-read string $ipAddress The IP address that the data in the model is
12
  * for.
 
 
 
13
  */
14
  class Domain extends AbstractModel
15
  {
16
  protected $domain;
17
  protected $ipAddress;
 
18
 
19
  /**
20
  * @ignore
21
- *
22
- * @param mixed $raw
23
  */
24
- public function __construct($raw)
25
  {
26
  parent::__construct($raw);
27
 
28
  $this->domain = $this->get('domain');
29
- $this->ipAddress = $this->get('ip_address');
 
 
30
  }
31
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * This class provides the GeoIP2 Domain model.
11
  *
14
  * "example.co.uk", not "foo.example.com".
15
  * @property-read string $ipAddress The IP address that the data in the model is
16
  * for.
17
+ * @property-read string $network The network in CIDR notation associated with
18
+ * the record. In particular, this is the largest network where all of the
19
+ * fields besides $ipAddress have the same value.
20
  */
21
  class Domain extends AbstractModel
22
  {
23
  protected $domain;
24
  protected $ipAddress;
25
+ protected $network;
26
 
27
  /**
28
  * @ignore
 
 
29
  */
30
+ public function __construct(array $raw)
31
  {
32
  parent::__construct($raw);
33
 
34
  $this->domain = $this->get('domain');
35
+ $ipAddress = $this->get('ip_address');
36
+ $this->ipAddress = $ipAddress;
37
+ $this->network = Util::cidr($ipAddress, $this->get('prefix_len'));
38
  }
39
  }
vendor/geoip2/geoip2/src/Model/Enterprise.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
5
  /**
@@ -7,40 +9,7 @@ namespace GeoIp2\Model;
7
  *
8
  * The only difference between the City and Enterprise model classes is which
9
  * fields in each record may be populated. See
10
- * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
- *
12
- * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
- * address.
14
- * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
- * requested IP address.
16
- * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
- * IP address. This object represents the country where MaxMind believes the
18
- * end user is located.
19
- * @property-read \GeoIp2\Record\Location $location Location data for the
20
- * requested IP address.
21
- * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
22
- * account.
23
- * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
24
- * data for the requested IP address. This record represents the country
25
- * where the ISP has registered a given IP block and may differ from the
26
- * user's country.
27
- * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
28
- * Represented country data for the requested IP address. The represented
29
- * country is used for things like military bases. It is only present when
30
- * the represented country differs from the country.
31
- * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
32
- * objects representing the country subdivisions for the requested IP
33
- * address. The number and type of subdivisions varies by country, but a
34
- * subdivision is typically a state, province, county, etc. Subdivisions
35
- * are ordered from most general (largest) to most specific (smallest).
36
- * If the response did not contain any subdivisions, this method returns
37
- * an empty array.
38
- * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
39
- * representing the most specific subdivision returned. If the response
40
- * did not contain any subdivisions, this method returns an empty
41
- * {@link \GeoIp2\Record\Subdivision} object.
42
- * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
43
- * requested IP address.
44
  */
45
  class Enterprise extends City
46
  {
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
  /**
9
  *
10
  * The only difference between the City and Enterprise model classes is which
11
  * fields in each record may be populated. See
12
+ * https://dev.maxmind.com/geoip/geoip2/web-services for more details.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  */
14
  class Enterprise extends City
15
  {
vendor/geoip2/geoip2/src/Model/Insights.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
5
  /**
@@ -7,40 +9,7 @@ namespace GeoIp2\Model;
7
  *
8
  * The only difference between the City and Insights model classes is which
9
  * fields in each record may be populated. See
10
- * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
- *
12
- * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
- * address.
14
- * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
- * requested IP address.
16
- * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
- * IP address. This object represents the country where MaxMind believes the
18
- * end user is located.
19
- * @property-read \GeoIp2\Record\Location $location Location data for the
20
- * requested IP address.
21
- * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
22
- * account.
23
- * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
24
- * data for the requested IP address. This record represents the country
25
- * where the ISP has registered a given IP block and may differ from the
26
- * user's country.
27
- * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
28
- * Represented country data for the requested IP address. The represented
29
- * country is used for things like military bases. It is only present when
30
- * the represented country differs from the country.
31
- * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
32
- * objects representing the country subdivisions for the requested IP
33
- * address. The number and type of subdivisions varies by country, but a
34
- * subdivision is typically a state, province, county, etc. Subdivisions
35
- * are ordered from most general (largest) to most specific (smallest).
36
- * If the response did not contain any subdivisions, this method returns
37
- * an empty array.
38
- * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
39
- * representing the most specific subdivision returned. If the response
40
- * did not contain any subdivisions, this method returns an empty
41
- * {@link \GeoIp2\Record\Subdivision} object.
42
- * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
43
- * requested IP address.
44
  */
45
  class Insights extends City
46
  {
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
  /**
9
  *
10
  * The only difference between the City and Insights model classes is which
11
  * fields in each record may be populated. See
12
+ * https://dev.maxmind.com/geoip/geoip2/web-services for more details.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  */
14
  class Insights extends City
15
  {
vendor/geoip2/geoip2/src/Model/Isp.php CHANGED
@@ -1,7 +1,11 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Model;
4
 
 
 
5
  /**
6
  * This class provides the GeoIP2 ISP model.
7
  *
@@ -16,6 +20,9 @@ namespace GeoIp2\Model;
16
  * with the IP address.
17
  * @property-read string $ipAddress The IP address that the data in the model is
18
  * for.
 
 
 
19
  */
20
  class Isp extends AbstractModel
21
  {
@@ -24,13 +31,12 @@ class Isp extends AbstractModel
24
  protected $isp;
25
  protected $organization;
26
  protected $ipAddress;
 
27
 
28
  /**
29
  * @ignore
30
- *
31
- * @param mixed $raw
32
  */
33
- public function __construct($raw)
34
  {
35
  parent::__construct($raw);
36
  $this->autonomousSystemNumber = $this->get('autonomous_system_number');
@@ -39,6 +45,8 @@ class Isp extends AbstractModel
39
  $this->isp = $this->get('isp');
40
  $this->organization = $this->get('organization');
41
 
42
- $this->ipAddress = $this->get('ip_address');
 
 
43
  }
44
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Model;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * This class provides the GeoIP2 ISP model.
11
  *
20
  * with the IP address.
21
  * @property-read string $ipAddress The IP address that the data in the model is
22
  * for.
23
+ * @property-read string $network The network in CIDR notation associated with
24
+ * the record. In particular, this is the largest network where all of the
25
+ * fields besides $ipAddress have the same value.
26
  */
27
  class Isp extends AbstractModel
28
  {
31
  protected $isp;
32
  protected $organization;
33
  protected $ipAddress;
34
+ protected $network;
35
 
36
  /**
37
  * @ignore
 
 
38
  */
39
+ public function __construct(array $raw)
40
  {
41
  parent::__construct($raw);
42
  $this->autonomousSystemNumber = $this->get('autonomous_system_number');
45
  $this->isp = $this->get('isp');
46
  $this->organization = $this->get('organization');
47
 
48
+ $ipAddress = $this->get('ip_address');
49
+ $this->ipAddress = $ipAddress;
50
+ $this->network = Util::cidr($ipAddress, $this->get('prefix_len'));
51
  }
52
  }
vendor/geoip2/geoip2/src/ProviderInterface.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2;
4
 
5
  interface ProviderInterface
@@ -9,12 +11,12 @@ interface ProviderInterface
9
  *
10
  * @return \GeoIp2\Model\Country a Country model for the requested IP address
11
  */
12
- public function country($ipAddress);
13
 
14
  /**
15
  * @param string $ipAddress an IPv4 or IPv6 address to lookup
16
  *
17
  * @return \GeoIp2\Model\City a City model for the requested IP address
18
  */
19
- public function city($ipAddress);
20
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2;
6
 
7
  interface ProviderInterface
11
  *
12
  * @return \GeoIp2\Model\Country a Country model for the requested IP address
13
  */
14
+ public function country(string $ipAddress): \GeoIp2\Model\Country;
15
 
16
  /**
17
  * @param string $ipAddress an IPv4 or IPv6 address to lookup
18
  *
19
  * @return \GeoIp2\Model\City a City model for the requested IP address
20
  */
21
+ public function city(string $ipAddress): \GeoIp2\Model\City;
22
  }
vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  abstract class AbstractPlaceRecord extends AbstractRecord
@@ -8,11 +10,8 @@ abstract class AbstractPlaceRecord extends AbstractRecord
8
 
9
  /**
10
  * @ignore
11
- *
12
- * @param mixed $record
13
- * @param mixed $locales
14
  */
15
- public function __construct($record, $locales = ['en'])
16
  {
17
  $this->locales = $locales;
18
  parent::__construct($record);
@@ -20,10 +19,8 @@ abstract class AbstractPlaceRecord extends AbstractRecord
20
 
21
  /**
22
  * @ignore
23
- *
24
- * @param mixed $attr
25
  */
26
- public function __get($attr)
27
  {
28
  if ($attr === 'name') {
29
  return $this->name();
@@ -34,26 +31,24 @@ abstract class AbstractPlaceRecord extends AbstractRecord
34
 
35
  /**
36
  * @ignore
37
- *
38
- * @param mixed $attr
39
  */
40
- public function __isset($attr)
41
  {
42
  if ($attr === 'name') {
43
- return $this->firstSetNameLocale() === null ? false : true;
44
  }
45
 
46
  return parent::__isset($attr);
47
  }
48
 
49
- private function name()
50
  {
51
  $locale = $this->firstSetNameLocale();
52
 
53
  return $locale === null ? null : $this->names[$locale];
54
  }
55
 
56
- private function firstSetNameLocale()
57
  {
58
  foreach ($this->locales as $locale) {
59
  if (isset($this->names[$locale])) {
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  abstract class AbstractPlaceRecord extends AbstractRecord
10
 
11
  /**
12
  * @ignore
 
 
 
13
  */
14
+ public function __construct(?array $record, array $locales = ['en'])
15
  {
16
  $this->locales = $locales;
17
  parent::__construct($record);
19
 
20
  /**
21
  * @ignore
 
 
22
  */
23
+ public function __get(string $attr)
24
  {
25
  if ($attr === 'name') {
26
  return $this->name();
31
 
32
  /**
33
  * @ignore
 
 
34
  */
35
+ public function __isset(string $attr): bool
36
  {
37
  if ($attr === 'name') {
38
+ return $this->firstSetNameLocale() !== null;
39
  }
40
 
41
  return parent::__isset($attr);
42
  }
43
 
44
+ private function name(): ?string
45
  {
46
  $locale = $this->firstSetNameLocale();
47
 
48
  return $locale === null ? null : $this->names[$locale];
49
  }
50
 
51
+ private function firstSetNameLocale(): ?string
52
  {
53
  foreach ($this->locales as $locale) {
54
  if (isset($this->names[$locale])) {
vendor/geoip2/geoip2/src/Record/AbstractRecord.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  abstract class AbstractRecord implements \JsonSerializable
@@ -8,20 +10,16 @@ abstract class AbstractRecord implements \JsonSerializable
8
 
9
  /**
10
  * @ignore
11
- *
12
- * @param mixed $record
13
  */
14
- public function __construct($record)
15
  {
16
  $this->record = isset($record) ? $record : [];
17
  }
18
 
19
  /**
20
  * @ignore
21
- *
22
- * @param mixed $attr
23
  */
24
- public function __get($attr)
25
  {
26
  // XXX - kind of ugly but greatly reduces boilerplate code
27
  $key = $this->attributeToKey($attr);
@@ -38,23 +36,23 @@ abstract class AbstractRecord implements \JsonSerializable
38
  throw new \RuntimeException("Unknown attribute: $attr");
39
  }
40
 
41
- public function __isset($attr)
42
  {
43
  return $this->validAttribute($attr) &&
44
  isset($this->record[$this->attributeToKey($attr)]);
45
  }
46
 
47
- private function attributeToKey($attr)
48
  {
49
  return strtolower(preg_replace('/([A-Z])/', '_\1', $attr));
50
  }
51
 
52
- private function validAttribute($attr)
53
  {
54
- return in_array($attr, $this->validAttributes, true);
55
  }
56
 
57
- public function jsonSerialize()
58
  {
59
  return $this->record;
60
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  abstract class AbstractRecord implements \JsonSerializable
10
 
11
  /**
12
  * @ignore
 
 
13
  */
14
+ public function __construct(?array $record)
15
  {
16
  $this->record = isset($record) ? $record : [];
17
  }
18
 
19
  /**
20
  * @ignore
 
 
21
  */
22
+ public function __get(string $attr)
23
  {
24
  // XXX - kind of ugly but greatly reduces boilerplate code
25
  $key = $this->attributeToKey($attr);
36
  throw new \RuntimeException("Unknown attribute: $attr");
37
  }
38
 
39
+ public function __isset(string $attr): bool
40
  {
41
  return $this->validAttribute($attr) &&
42
  isset($this->record[$this->attributeToKey($attr)]);
43
  }
44
 
45
+ private function attributeToKey(string $attr): string
46
  {
47
  return strtolower(preg_replace('/([A-Z])/', '_\1', $attr));
48
  }
49
 
50
+ private function validAttribute(string $attr): bool
51
  {
52
+ return \in_array($attr, $this->validAttributes, true);
53
  }
54
 
55
+ public function jsonSerialize(): ?array
56
  {
57
  return $this->record;
58
  }
vendor/geoip2/geoip2/src/Record/City.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
vendor/geoip2/geoip2/src/Record/Continent.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
vendor/geoip2/geoip2/src/Record/Country.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
@@ -15,10 +17,9 @@ namespace GeoIp2\Record;
15
  * @property-read bool $isInEuropeanUnion This is true if the country is a
16
  * member state of the European Union. This attribute is returned by all
17
  * location services and databases.
18
- * @property-read string|null $isoCode The
19
- * {@link * http://en.wikipedia.org/wiki/ISO_3166-1 two-character ISO 3166-1 alpha
20
- * code} for the country. This attribute is returned by all location services
21
- * and databases.
22
  * @property-read string|null $name The name of the country based on the locales
23
  * list passed to the constructor. This attribute is returned by all location
24
  * services and databases.
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
17
  * @property-read bool $isInEuropeanUnion This is true if the country is a
18
  * member state of the European Union. This attribute is returned by all
19
  * location services and databases.
20
+ * @property-read string|null $isoCode The two-character ISO 3166-1 alpha code
21
+ * for the country. See https://en.wikipedia.org/wiki/ISO_3166-1. This
22
+ * attribute is returned by all location services and databases.
 
23
  * @property-read string|null $name The name of the country based on the locales
24
  * list passed to the constructor. This attribute is returned by all location
25
  * services and databases.
vendor/geoip2/geoip2/src/Record/Location.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
@@ -27,11 +29,11 @@ namespace GeoIp2\Record;
27
  * from the Insights service.
28
  * @property-read int|null $metroCode The metro code of the location if the location
29
  * is in the US. MaxMind returns the same metro codes as the
30
- * {@link * https://developers.google.com/adwords/api/docs/appendix/cities-DMAregions
31
- * Google AdWords API}.
32
  * @property-read string|null $timeZone The time zone associated with location, as
33
- * specified by the {@link http://www.iana.org/time-zones IANA Time Zone
34
- * Database}, e.g., "America/New_York".
35
  */
36
  class Location extends AbstractRecord
37
  {
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
29
  * from the Insights service.
30
  * @property-read int|null $metroCode The metro code of the location if the location
31
  * is in the US. MaxMind returns the same metro codes as the
32
+ * Google AdWords API. See
33
+ * https://developers.google.com/adwords/api/docs/appendix/cities-DMAregions.
34
  * @property-read string|null $timeZone The time zone associated with location, as
35
+ * specified by the IANA Time Zone Database, e.g., "America/New_York". See
36
+ * https://www.iana.org/time-zones.
37
  */
38
  class Location extends AbstractRecord
39
  {
vendor/geoip2/geoip2/src/Record/MaxMind.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
vendor/geoip2/geoip2/src/Record/Postal.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
vendor/geoip2/geoip2/src/Record/RepresentedCountry.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
@@ -9,19 +11,6 @@ namespace GeoIp2\Record;
9
  * for the IP's represented country. The represented country is the country
10
  * represented by something like a military base.
11
  *
12
- * @property-read int|null $confidence A value from 0-100 indicating MaxMind's
13
- * confidence that the country is correct. This attribute is only available
14
- * from the Insights service and the GeoIP2 Enterprise database.
15
- * @property-read int|null $geonameId The GeoName ID for the country.
16
- * @property-read bool $isInEuropeanUnion This is true if the country is a
17
- * member state of the European Union. This attribute is returned by all
18
- * location services and databases.
19
- * @property-read string|null $isoCode The {@link http://en.wikipedia.org/wiki/ISO_3166-1
20
- * two-character ISO 3166-1 alpha code} for the country.
21
- * @property-read string|null $name The name of the country based on the locales list
22
- * passed to the constructor.
23
- * @property-read array|null $names An array map where the keys are locale codes and
24
- * the values are names.
25
  * @property-read string|null $type A string indicating the type of entity that is
26
  * representing the country. Currently we only return <code>military</code>
27
  * but this could expand to include other types in the future.
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
11
  * for the IP's represented country. The represented country is the country
12
  * represented by something like a military base.
13
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  * @property-read string|null $type A string indicating the type of entity that is
15
  * representing the country. Currently we only return <code>military</code>
16
  * but this could expand to include other types in the future.
vendor/geoip2/geoip2/src/Record/Subdivision.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
5
  /**
@@ -16,9 +18,9 @@ namespace GeoIp2\Record;
16
  * This attribute is returned by all location databases and services besides
17
  * Country.
18
  * @property-read string|null $isoCode This is a string up to three characters long
19
- * contain the subdivision portion of the
20
- * {@link * http://en.wikipedia.org/wiki/ISO_3166-2 ISO 3166-2 code}. This attribute
21
- * is returned by all location databases and services except Country.
22
  * @property-read string|null $name The name of the subdivision based on the
23
  * locales list passed to the constructor. This attribute is returned by all
24
  * location databases and services besides Country.
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
  /**
18
  * This attribute is returned by all location databases and services besides
19
  * Country.
20
  * @property-read string|null $isoCode This is a string up to three characters long
21
+ * contain the subdivision portion of the ISO 3166-2 code. See
22
+ * https://en.wikipedia.org/wiki/ISO_3166-2. This attribute is returned by all
23
+ * location databases and services except Country.
24
  * @property-read string|null $name The name of the subdivision based on the
25
  * locales list passed to the constructor. This attribute is returned by all
26
  * location databases and services besides Country.
vendor/geoip2/geoip2/src/Record/Traits.php CHANGED
@@ -1,22 +1,26 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\Record;
4
 
 
 
5
  /**
6
  * Contains data for the traits record associated with an IP address.
7
  *
8
  * This record is returned by all location services and databases.
9
  *
10
- * @property-read int|null $autonomousSystemNumber The
11
- * {@link * http://en.wikipedia.org/wiki/Autonomous_system_(Internet) autonomous
12
- * system number} associated with the IP address. This attribute is only
13
- * available from the City and Insights web service and the GeoIP2
14
  * Enterprise database.
15
  * @property-read string|null $autonomousSystemOrganization The organization
16
- * associated with the registered {@link * http://en.wikipedia.org/wiki/Autonomous_system_(Internet) autonomous
17
- * system number} for the IP address. This attribute is only available from
18
- * the City and Insights web service and the GeoIP2 Enterprise
19
- * database.
20
  * @property-read string|null $connectionType The connection type may take the
21
  * following values: "Dialup", "Cable/DSL", "Corporate", "Cellular".
22
  * Additional values may be added in the future. This attribute is only
@@ -35,16 +39,18 @@ namespace GeoIp2\Record;
35
  * @property-read bool $isAnonymous This is true if the IP address belongs to
36
  * any sort of anonymous network. This property is only available from GeoIP2
37
  * Precision Insights.
38
- * @property-read bool $isAnonymousProxy *Deprecated.* Please see our
39
- * {@link * https://www.maxmind.com/en/geoip2-anonymous-ip-database GeoIP2
40
- * Anonymous IP database} to determine whether the IP address is used by an
41
- * anonymizing service.
42
- * @property-read bool $isAnonymousVpn This is true if the IP address belongs to
43
- * an anonymous VPN system. This property is only available from GeoIP2
44
- * Precision Insights.
 
 
45
  * @property-read bool $isHostingProvider This is true if the IP address belongs
46
- * to a hosting provider. This property is only available from GeoIP2
47
- * Precision Insights.
48
  * @property-read bool $isLegitimateProxy This attribute is true if MaxMind
49
  * believes this IP address to be a legitimate proxy, such as an internal
50
  * VPN used by a corporation. This attribute is only available in the GeoIP2
@@ -52,6 +58,9 @@ namespace GeoIp2\Record;
52
  * @property-read bool $isPublicProxy This is true if the IP address belongs to
53
  * a public proxy. This property is only available from GeoIP2 Precision
54
  * Insights.
 
 
 
55
  * @property-read bool $isSatelliteProvider *Deprecated.* Due to the
56
  * increased coverage by mobile carriers, very few satellite providers now
57
  * serve multiple countries. As a result, the output does not provide
@@ -61,9 +70,19 @@ namespace GeoIp2\Record;
61
  * @property-read string|null $isp The name of the ISP associated with the IP
62
  * address. This attribute is only available from the City and Insights web
63
  * services and the GeoIP2 Enterprise database.
 
 
 
64
  * @property-read string|null $organization The name of the organization associated
65
  * with the IP address. This attribute is only available from the City and
66
  * Insights web services and the GeoIP2 Enterprise database.
 
 
 
 
 
 
 
67
  * @property-read string|null $userType <p>The user type associated with the IP
68
  * address. This can be one of the following values:</p>
69
  * <ul>
@@ -106,9 +125,22 @@ class Traits extends AbstractRecord
106
  'isLegitimateProxy',
107
  'isp',
108
  'isPublicProxy',
 
109
  'isSatelliteProvider',
110
  'isTorExitNode',
 
111
  'organization',
 
 
112
  'userType',
113
  ];
 
 
 
 
 
 
 
 
 
114
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\Record;
6
 
7
+ use GeoIp2\Util;
8
+
9
  /**
10
  * Contains data for the traits record associated with an IP address.
11
  *
12
  * This record is returned by all location services and databases.
13
  *
14
+ * @property-read int|null $autonomousSystemNumber The autonomous system number
15
+ * associated with the IP address. See
16
+ * https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This attribute
17
+ * is only available from the City and Insights web service and the GeoIP2
18
  * Enterprise database.
19
  * @property-read string|null $autonomousSystemOrganization The organization
20
+ * associated with the registered autonomous system number for the IP address.
21
+ * See https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This
22
+ * attribute is only available from the City and Insights web service and the
23
+ * GeoIP2 Enterprise database.
24
  * @property-read string|null $connectionType The connection type may take the
25
  * following values: "Dialup", "Cable/DSL", "Corporate", "Cellular".
26
  * Additional values may be added in the future. This attribute is only
39
  * @property-read bool $isAnonymous This is true if the IP address belongs to
40
  * any sort of anonymous network. This property is only available from GeoIP2
41
  * Precision Insights.
42
+ * @property-read bool $isAnonymousProxy *Deprecated.* Please see our GeoIP2
43
+ * Anonymous IP database
44
+ * (https://www.maxmind.com/en/geoip2-anonymous-ip-database) to determine
45
+ * whether the IP address is used by an anonymizing service.
46
+ * @property-read bool $isAnonymousVpn This is true if the IP address is
47
+ * registered to an anonymous VPN provider. If a VPN provider does not register
48
+ * subnets under names associated with them, we will likely only flag their IP
49
+ * ranges using the isHostingProvider property. This property is only available
50
+ * from GeoIP2 Precision Insights.
51
  * @property-read bool $isHostingProvider This is true if the IP address belongs
52
+ * to a hosting or VPN provider (see description of isAnonymousVpn property).
53
+ * This property is only available from GeoIP2 Precision Insights.
54
  * @property-read bool $isLegitimateProxy This attribute is true if MaxMind
55
  * believes this IP address to be a legitimate proxy, such as an internal
56
  * VPN used by a corporation. This attribute is only available in the GeoIP2
58
  * @property-read bool $isPublicProxy This is true if the IP address belongs to
59
  * a public proxy. This property is only available from GeoIP2 Precision
60
  * Insights.
61
+ * @property-read bool $isResidentialProxy This is true if the IP address is
62
+ * on a suspected anonymizing network and belongs to a residential ISP. This
63
+ * property is only available from GeoIP2 Precision Insights.
64
  * @property-read bool $isSatelliteProvider *Deprecated.* Due to the
65
  * increased coverage by mobile carriers, very few satellite providers now
66
  * serve multiple countries. As a result, the output does not provide
70
  * @property-read string|null $isp The name of the ISP associated with the IP
71
  * address. This attribute is only available from the City and Insights web
72
  * services and the GeoIP2 Enterprise database.
73
+ * @property-read string $network The network in CIDR notation associated with
74
+ * the record. In particular, this is the largest network where all of the
75
+ * fields besides $ipAddress have the same value.
76
  * @property-read string|null $organization The name of the organization associated
77
  * with the IP address. This attribute is only available from the City and
78
  * Insights web services and the GeoIP2 Enterprise database.
79
+ * @property-read float|null $staticIPScore An indicator of how static or
80
+ * dynamic an IP address is. This property is only available from GeoIP2
81
+ * Precision Insights.
82
+ * @property-read int|null $userCount The estimated number of users sharing
83
+ * the IP/network during the past 24 hours. For IPv4, the count is for the
84
+ * individual IP. For IPv6, the count is for the /64 network. This property is
85
+ * only available from GeoIP2 Precision Insights.
86
  * @property-read string|null $userType <p>The user type associated with the IP
87
  * address. This can be one of the following values:</p>
88
  * <ul>
125
  'isLegitimateProxy',
126
  'isp',
127
  'isPublicProxy',
128
+ 'isResidentialProxy',
129
  'isSatelliteProvider',
130
  'isTorExitNode',
131
+ 'network',
132
  'organization',
133
+ 'staticIpScore',
134
+ 'userCount',
135
  'userType',
136
  ];
137
+
138
+ public function __construct(?array $record)
139
+ {
140
+ if (!isset($record['network']) && isset($record['ip_address']) && isset($record['prefix_len'])) {
141
+ $record['network'] = Util::cidr($record['ip_address'], $record['prefix_len']);
142
+ }
143
+
144
+ parent::__construct($record);
145
+ }
146
  }
vendor/geoip2/geoip2/src/Util.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2;
4
 
5
  class Util
@@ -10,11 +12,8 @@ class Util
10
  *
11
  * @internal
12
  * @ignore
13
- *
14
- * @param mixed $ipAddress
15
- * @param mixed $prefixLen
16
  */
17
- public static function cidr($ipAddress, $prefixLen)
18
  {
19
  $ipBytes = inet_pton($ipAddress);
20
  $networkBytes = str_repeat("\0", \strlen($ipBytes));
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2;
6
 
7
  class Util
12
  *
13
  * @internal
14
  * @ignore
 
 
 
15
  */
16
+ public static function cidr(string $ipAddress, int $prefixLen): string
17
  {
18
  $ipBytes = inet_pton($ipAddress);
19
  $networkBytes = str_repeat("\0", \strlen($ipBytes));
vendor/geoip2/geoip2/src/WebService/Client.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace GeoIp2\WebService;
4
 
5
  use GeoIp2\Exception\AddressNotFoundException;
@@ -47,7 +49,7 @@ class Client implements ProviderInterface
47
  private $client;
48
  private static $basePath = '/geoip/v2.1';
49
 
50
- const VERSION = 'v2.9.0';
51
 
52
  /**
53
  * Constructor.
@@ -65,16 +67,16 @@ class Client implements ProviderInterface
65
  * `http://username:password@127.0.0.1:10`.
66
  */
67
  public function __construct(
68
- $accountId,
69
- $licenseKey,
70
- $locales = ['en'],
71
- $options = []
72
  ) {
73
  $this->locales = $locales;
74
 
75
  // This is for backwards compatibility. Do not remove except for a
76
  // major version bump.
77
- if (is_string($options)) {
78
  $options = ['host' => $options];
79
  }
80
 
@@ -87,7 +89,7 @@ class Client implements ProviderInterface
87
  $this->client = new WsClient($accountId, $licenseKey, $options);
88
  }
89
 
90
- private function userAgent()
91
  {
92
  return 'GeoIP2-API/' . self::VERSION;
93
  }
@@ -111,14 +113,12 @@ class Client implements ProviderInterface
111
  * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
112
  * This could indicate a problem with the connection between
113
  * your server and the web service or that the web service
114
- * returned an invalid document or 500 error code.
115
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
116
  * class to the above exceptions. It will be thrown directly
117
  * if a 200 status code is returned but the body is invalid.
118
- *
119
- * @return \GeoIp2\Model\City
120
  */
121
- public function city($ipAddress = 'me')
122
  {
123
  return $this->responseFor('city', 'City', $ipAddress);
124
  }
@@ -146,10 +146,8 @@ class Client implements ProviderInterface
146
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent class to the above exceptions. It
147
  * will be thrown directly if a 200 status code is returned but
148
  * the body is invalid.
149
- *
150
- * @return \GeoIp2\Model\Country
151
  */
152
- public function country($ipAddress = 'me')
153
  {
154
  return $this->responseFor('country', 'Country', $ipAddress);
155
  }
@@ -173,19 +171,17 @@ class Client implements ProviderInterface
173
  * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
174
  * This could indicate a problem with the connection between
175
  * your server and the web service or that the web service
176
- * returned an invalid document or 500 error code.
177
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
178
  * class to the above exceptions. It will be thrown directly
179
  * if a 200 status code is returned but the body is invalid.
180
- *
181
- * @return \GeoIp2\Model\Insights
182
  */
183
- public function insights($ipAddress = 'me')
184
  {
185
  return $this->responseFor('insights', 'Insights', $ipAddress);
186
  }
187
 
188
- private function responseFor($endpoint, $class, $ipAddress)
189
  {
190
  $path = implode('/', [self::$basePath, $endpoint, $ipAddress]);
191
 
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace GeoIp2\WebService;
6
 
7
  use GeoIp2\Exception\AddressNotFoundException;
49
  private $client;
50
  private static $basePath = '/geoip/v2.1';
51
 
52
+ const VERSION = 'v2.11.0';
53
 
54
  /**
55
  * Constructor.
67
  * `http://username:password@127.0.0.1:10`.
68
  */
69
  public function __construct(
70
+ int $accountId,
71
+ string $licenseKey,
72
+ array $locales = ['en'],
73
+ array $options = []
74
  ) {
75
  $this->locales = $locales;
76
 
77
  // This is for backwards compatibility. Do not remove except for a
78
  // major version bump.
79
+ if (\is_string($options)) {
80
  $options = ['host' => $options];
81
  }
82
 
89
  $this->client = new WsClient($accountId, $licenseKey, $options);
90
  }
91
 
92
+ private function userAgent(): string
93
  {
94
  return 'GeoIP2-API/' . self::VERSION;
95
  }
113
  * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
114
  * This could indicate a problem with the connection between
115
  * your server and the web service or that the web service
116
+ * returned an invalid document or 500 error code
117
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
118
  * class to the above exceptions. It will be thrown directly
119
  * if a 200 status code is returned but the body is invalid.
 
 
120
  */
121
+ public function city(string $ipAddress = 'me'): \GeoIp2\Model\City
122
  {
123
  return $this->responseFor('city', 'City', $ipAddress);
124
  }
146
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent class to the above exceptions. It
147
  * will be thrown directly if a 200 status code is returned but
148
  * the body is invalid.
 
 
149
  */
150
+ public function country(string $ipAddress = 'me'): \GeoIp2\Model\Country
151
  {
152
  return $this->responseFor('country', 'Country', $ipAddress);
153
  }
171
  * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
172
  * This could indicate a problem with the connection between
173
  * your server and the web service or that the web service
174
+ * returned an invalid document or 500 error code
175
  * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
176
  * class to the above exceptions. It will be thrown directly
177
  * if a 200 status code is returned but the body is invalid.
 
 
178
  */
179
+ public function insights(string $ipAddress = 'me'): \GeoIp2\Model\Insights
180
  {
181
  return $this->responseFor('insights', 'Insights', $ipAddress);
182
  }
183
 
184
+ private function responseFor(string $endpoint, string $class, string $ipAddress)
185
  {
186
  $path = implode('/', [self::$basePath, $endpoint, $ipAddress]);
187
 
vendor/maxmind-db/reader/CHANGELOG.md CHANGED
@@ -1,6 +1,62 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  1.5.0 (2019-09-30)
5
  ------------------
6
 
1
  CHANGELOG
2
  =========
3
 
4
+ 1.10.0 (2021-02-09)
5
+ -------------------
6
+
7
+ * When using the pure PHP reader, unsigned integers up to PHP_MAX_INT
8
+ will now be integers in PHP rather than strings. Previously integers
9
+ greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms
10
+ would be strings due to the use of `gmp` or `bcmath` to decode them.
11
+ Reported by Alejandro Celaya. GitHub #119.
12
+
13
+ 1.9.0 (2021-01-07)
14
+ ------------------
15
+
16
+ * The `maxminddb` extension is now buildable on Windows. Pull request
17
+ by Jan Ehrhardt. GitHub #115.
18
+
19
+ 1.8.0 (2020-10-01)
20
+ ------------------
21
+
22
+ * Fixes for PHP 8.0. Pull Request by Remi Collet. GitHub #108.
23
+
24
+ 1.7.0 (2020-08-07)
25
+ ------------------
26
+
27
+ * IMPORTANT: PHP 7.2 or greater is now required.
28
+ * The extension no longer depends on the pure PHP classes in
29
+ `maxmind-db/reader`. You can use it independently.
30
+ * Type hints have been added to both the pure PHP implementation
31
+ and the extension.
32
+ * The `metadata` method on the reader now returns a new copy of the
33
+ metadata object rather than the actual object used by the reader.
34
+ * Work around PHP `is_readable()` bug. Reported by Ben Roberts. GitHub
35
+ #92.
36
+ * This is the first release of the extension as a PECL package.
37
+ GitHub #34.
38
+
39
+ 1.6.0 (2019-12-19)
40
+ ------------------
41
+
42
+ * 1.5.0 and 1.5.1 contained a possible memory corruptions when using
43
+ `getWithPrefixLen`. This has been fixed. Reported by proton-ab.
44
+ GitHub #96.
45
+ * The `composer.json` file now conflicts with all versions of the
46
+ `maxminddb` C extension less than the Composer version. This is to
47
+ reduce the chance of having an older, conflicting version of the
48
+ extension installed. You will need to upgrade the extension before
49
+ running `composer update`. Pull request by Benoît Burnichon. GitHub
50
+ #97.
51
+
52
+ 1.5.1 (2019-12-12)
53
+ ------------------
54
+
55
+ * Minor performance improvements.
56
+ * Make tests pass with older versions of libmaxminddb. PR by Remi
57
+ Collet. GitHub #90.
58
+ * Test enhancements. PR by Chun-Sheng, Li. GitHub #91.
59
+
60
  1.5.0 (2019-09-30)
61
  ------------------
62
 
vendor/maxmind-db/reader/README.md CHANGED
@@ -112,9 +112,16 @@ you are using an autoloader, no changes to your code should be necessary.
112
 
113
  First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
114
  described in its [README.md
115
- file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball).
116
- After successfully installing libmaxmindb, run the following commands from the
117
- top-level directory of this distribution:
 
 
 
 
 
 
 
118
 
119
  ```
120
  cd ext
@@ -157,7 +164,7 @@ client API, please see [our support page](https://www.maxmind.com/en/support).
157
 
158
  ## Requirements ##
159
 
160
- This library requires PHP 5.6 or greater.
161
 
162
  The GMP or BCMath extension may be required to read some databases
163
  using the pure PHP API.
@@ -173,6 +180,6 @@ The MaxMind DB Reader PHP API uses [Semantic Versioning](https://semver.org/).
173
 
174
  ## Copyright and License ##
175
 
176
- This software is Copyright (c) 2014-2019 by MaxMind, Inc.
177
 
178
  This is free software, licensed under the Apache License, Version 2.0.
112
 
113
  First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
114
  described in its [README.md
115
+ file](https://github.com/maxmind/libmaxminddb/blob/main/README.md#installing-from-a-tarball).
116
+ After successfully installing libmaxmindb, you may install the extension
117
+ from [pecl](https://pecl.php.net/package/maxminddb):
118
+
119
+ ```
120
+ pecl install maxminddb
121
+ ```
122
+
123
+ Alternatively, you may install it from the source. To do so, run the following
124
+ commands from the top-level directory of this distribution:
125
 
126
  ```
127
  cd ext
164
 
165
  ## Requirements ##
166
 
167
+ This library requires PHP 7.2 or greater.
168
 
169
  The GMP or BCMath extension may be required to read some databases
170
  using the pure PHP API.
180
 
181
  ## Copyright and License ##
182
 
183
+ This software is Copyright (c) 2014-2020 by MaxMind, Inc.
184
 
185
  This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind-db/reader/autoload.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  /**
4
  * PSR-4 autoloader implementation for the MaxMind\DB namespace.
5
  * First we define the 'mmdb_autoload' function, and then we register
@@ -14,7 +16,7 @@
14
  * @param string $class
15
  * the name of the class to load
16
  */
17
- function mmdb_autoload($class)
18
  {
19
  /*
20
  * A project-specific mapping between the namespaces and where
@@ -26,16 +28,16 @@ function mmdb_autoload($class)
26
  $namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
27
 
28
  foreach ($namespace_map as $prefix => $dir) {
29
- /* First swap out the namespace prefix with a directory... */
30
  $path = str_replace($prefix, $dir, $class);
31
 
32
- /* replace the namespace separator with a directory separator... */
33
  $path = str_replace('\\', '/', $path);
34
 
35
- /* and finally, add the PHP file extension to the result. */
36
  $path = $path . '.php';
37
 
38
- /* $path should now contain the path to a PHP file defining $class */
39
  if (file_exists($path)) {
40
  include $path;
41
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  /**
6
  * PSR-4 autoloader implementation for the MaxMind\DB namespace.
7
  * First we define the 'mmdb_autoload' function, and then we register
16
  * @param string $class
17
  * the name of the class to load
18
  */
19
+ function mmdb_autoload($class): void
20
  {
21
  /*
22
  * A project-specific mapping between the namespaces and where
28
  $namespace_map = ['MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/'];
29
 
30
  foreach ($namespace_map as $prefix => $dir) {
31
+ // First swap out the namespace prefix with a directory...
32
  $path = str_replace($prefix, $dir, $class);
33
 
34
+ // replace the namespace separator with a directory separator...
35
  $path = str_replace('\\', '/', $path);
36
 
37
+ // and finally, add the PHP file extension to the result.
38
  $path = $path . '.php';
39
 
40
+ // $path should now contain the path to a PHP file defining $class
41
  if (file_exists($path)) {
42
  include $path;
43
  }
vendor/maxmind-db/reader/composer.json CHANGED
@@ -13,23 +13,32 @@
13
  }
14
  ],
15
  "require": {
16
- "php": ">=5.6"
17
  },
18
  "suggest": {
19
  "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
20
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
21
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
22
  },
 
 
 
23
  "require-dev": {
24
- "friendsofphp/php-cs-fixer": "2.*",
25
- "phpunit/phpunit": "5.*",
26
  "php-coveralls/php-coveralls": "^2.1",
27
- "phpunit/phpcov": "^3.0",
28
- "squizlabs/php_codesniffer": "3.*"
 
29
  },
30
  "autoload": {
31
  "psr-4": {
32
  "MaxMind\\Db\\": "src/MaxMind/Db"
33
  }
 
 
 
 
 
34
  }
35
  }
13
  }
14
  ],
15
  "require": {
16
+ "php": ">=7.2"
17
  },
18
  "suggest": {
19
  "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
20
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
21
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
22
  },
23
+ "conflict": {
24
+ "ext-maxminddb": "<1.10.0,>=2.0.0"
25
+ },
26
  "require-dev": {
27
+ "friendsofphp/php-cs-fixer": "*",
28
+ "phpunit/phpunit": ">=8.0.0,<10.0.0",
29
  "php-coveralls/php-coveralls": "^2.1",
30
+ "phpunit/phpcov": ">=6.0.0",
31
+ "squizlabs/php_codesniffer": "3.*",
32
+ "phpstan/phpstan": "*"
33
  },
34
  "autoload": {
35
  "psr-4": {
36
  "MaxMind\\Db\\": "src/MaxMind/Db"
37
  }
38
+ },
39
+ "autoload-dev": {
40
+ "psr-4": {
41
+ "MaxMind\\Db\\Test\\Reader\\": "tests/MaxMind/Db/Test/Reader"
42
+ }
43
  }
44
  }
vendor/maxmind-db/reader/ext/config.w32 ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ ARG_WITH("maxminddb", "Enable MaxMind DB Reader extension support", "no");
2
+
3
+ if (PHP_MAXMINDDB == "yes") {
4
+ if (CHECK_HEADER_ADD_INCLUDE("maxminddb.h", "CFLAGS_MAXMINDDB", PHP_MAXMINDDB + ";" + PHP_PHP_BUILD + "\\include\\maxminddb") &&
5
+ CHECK_LIB("libmaxminddb.lib", "maxminddb", PHP_MAXMINDDB)) {
6
+ EXTENSION("maxminddb", "maxminddb.c");
7
+ } else {
8
+ WARNING('Could not find maxminddb.h or libmaxminddb.lib; skipping');
9
+ }
10
+ }
vendor/maxmind-db/reader/ext/maxminddb.c CHANGED
@@ -21,6 +21,8 @@
21
  #include <zend.h>
22
 
23
  #include "Zend/zend_exceptions.h"
 
 
24
  #include "ext/standard/info.h"
25
  #include <maxminddb.h>
26
 
@@ -33,53 +35,48 @@
33
 
34
  #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
35
  #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
 
 
36
  #define PHP_MAXMINDDB_READER_EX_NS \
37
  ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
38
 
39
- #ifdef ZEND_ENGINE_3
40
  #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
41
- #define _ZVAL_STRING ZVAL_STRING
42
- #define _ZVAL_STRINGL ZVAL_STRINGL
43
  typedef size_t strsize_t;
44
  typedef zend_object free_obj_t;
45
- #else
46
- #define Z_MAXMINDDB_P(zv) \
47
- (maxminddb_obj *)zend_object_store_get_object(zv TSRMLS_CC)
48
- #define _ZVAL_STRING(a, b) ZVAL_STRING(a, b, 1)
49
- #define _ZVAL_STRINGL(a, b, c) ZVAL_STRINGL(a, b, c, 1)
50
- typedef int strsize_t;
51
- typedef void free_obj_t;
52
- #endif
53
 
54
  /* For PHP 8 compatibility */
55
- #ifndef TSRMLS_C
 
 
 
 
 
 
 
56
  #define TSRMLS_C
57
- #endif
58
- #ifndef TSRMLS_CC
59
  #define TSRMLS_CC
60
- #endif
61
- #ifndef TSRMLS_DC
62
  #define TSRMLS_DC
 
 
63
  #endif
 
64
  #ifndef ZEND_ACC_CTOR
65
  #define ZEND_ACC_CTOR 0
66
  #endif
67
 
68
- #ifdef ZEND_ENGINE_3
 
 
 
 
69
  typedef struct _maxminddb_obj {
70
  MMDB_s *mmdb;
71
  zend_object std;
72
  } maxminddb_obj;
73
- #else
74
- typedef struct _maxminddb_obj {
75
- zend_object std;
76
- MMDB_s *mmdb;
77
- } maxminddb_obj;
78
- #endif
79
 
80
  PHP_FUNCTION(maxminddb);
81
 
82
- static void
83
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len);
84
  static const MMDB_entry_data_list_s *
85
  handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
@@ -96,7 +93,6 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
96
  zval *z_value TSRMLS_DC);
97
  static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
98
  zval *z_value TSRMLS_DC);
99
- static zend_class_entry *lookup_class(const char *name TSRMLS_DC);
100
 
101
  #define CHECK_ALLOCATED(val) \
102
  if (!val) { \
@@ -104,38 +100,16 @@ static zend_class_entry *lookup_class(const char *name TSRMLS_DC);
104
  return; \
105
  }
106
 
107
- #define THROW_EXCEPTION(name, ...) \
108
- { \
109
- zend_class_entry *exception_ce = lookup_class(name TSRMLS_CC); \
110
- zend_throw_exception_ex(exception_ce, 0 TSRMLS_CC, __VA_ARGS__); \
111
- }
112
-
113
- #if PHP_VERSION_ID < 50399
114
- #define object_properties_init(zo, class_type) \
115
- { \
116
- zval *tmp; \
117
- zend_hash_copy((*zo).properties, \
118
- &class_type->default_properties, \
119
- (copy_ctor_func_t)zval_add_ref, \
120
- (void *)&tmp, \
121
- sizeof(zval *)); \
122
- }
123
- #endif
124
-
125
  static zend_object_handlers maxminddb_obj_handlers;
126
- static zend_class_entry *maxminddb_ce;
127
 
128
  static inline maxminddb_obj *
129
  php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
130
- #ifdef ZEND_ENGINE_3
131
  return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
132
- #else
133
- return (maxminddb_obj *)obj;
134
- #endif
135
  }
136
 
137
- ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_construct, 0, 0, 1)
138
- ZEND_ARG_INFO(0, db_file)
139
  ZEND_END_ARG_INFO()
140
 
141
  PHP_METHOD(MaxMind_Db_Reader, __construct) {
@@ -150,27 +124,29 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
150
  maxminddb_ce,
151
  &db_file,
152
  &name_len) == FAILURE) {
153
- THROW_EXCEPTION("InvalidArgumentException",
154
- "The constructor takes exactly one argument.");
155
  return;
156
  }
157
 
158
  if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
159
  0 != access(db_file, R_OK)) {
160
- THROW_EXCEPTION("InvalidArgumentException",
161
- "The file \"%s\" does not exist or is not readable.",
162
- db_file);
 
 
163
  return;
164
  }
165
 
166
- MMDB_s *mmdb = (MMDB_s *)emalloc(sizeof(MMDB_s));
167
  uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
168
 
169
  if (MMDB_SUCCESS != status) {
170
- THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
171
- "Error opening database file (%s). Is this a valid "
172
- "MaxMind DB file?",
173
- db_file);
 
 
174
  efree(mmdb);
175
  return;
176
  }
@@ -179,8 +155,9 @@ PHP_METHOD(MaxMind_Db_Reader, __construct) {
179
  mmdb_obj->mmdb = mmdb;
180
  }
181
 
182
- ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_get, 0, 0, 1)
183
- ZEND_ARG_INFO(0, ip_address)
 
184
  ZEND_END_ARG_INFO()
185
 
186
  PHP_METHOD(MaxMind_Db_Reader, get) {
@@ -188,43 +165,41 @@ PHP_METHOD(MaxMind_Db_Reader, get) {
188
  get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
189
  }
190
 
 
 
 
 
 
191
  PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
192
- zval *record, *z_prefix_len;
193
- #ifdef ZEND_ENGINE_3
194
- zval _record, _z_prefix_len;
195
- record = &_record;
196
- z_prefix_len = &_z_prefix_len;
197
- #else
198
- ALLOC_INIT_ZVAL(record);
199
- ALLOC_INIT_ZVAL(z_prefix_len);
200
- #endif
201
 
202
  int prefix_len = 0;
203
- get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, record, &prefix_len);
 
 
 
204
 
205
  array_init(return_value);
206
- add_next_index_zval(return_value, record);
207
 
208
- ZVAL_LONG(z_prefix_len, prefix_len);
209
- add_next_index_zval(return_value, z_prefix_len);
210
  }
211
 
212
- static void
213
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
214
  char *ip_address = NULL;
215
  strsize_t name_len;
216
- zval *_this_zval = NULL;
217
 
218
  if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
219
  getThis(),
220
  "Os",
221
- &_this_zval,
222
  maxminddb_ce,
223
  &ip_address,
224
  &name_len) == FAILURE) {
225
- THROW_EXCEPTION("InvalidArgumentException",
226
- "Method takes exactly one argument.");
227
- return;
228
  }
229
 
230
  const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
@@ -232,30 +207,33 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
232
  MMDB_s *mmdb = mmdb_obj->mmdb;
233
 
234
  if (NULL == mmdb) {
235
- THROW_EXCEPTION("BadMethodCallException",
236
- "Attempt to read from a closed MaxMind DB.");
237
- return;
 
238
  }
239
 
240
  struct addrinfo hints = {
241
  .ai_family = AF_UNSPEC,
242
  .ai_flags = AI_NUMERICHOST,
243
- // We set ai_socktype so that we only get one result back
244
  .ai_socktype = SOCK_STREAM};
245
 
246
  struct addrinfo *addresses = NULL;
247
  int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
248
  if (gai_status) {
249
- THROW_EXCEPTION("InvalidArgumentException",
250
- "The value \"%s\" is not a valid IP address.",
251
- ip_address);
252
- return;
 
253
  }
254
  if (!addresses || !addresses->ai_addr) {
255
- THROW_EXCEPTION(
256
- "InvalidArgumentException",
 
257
  "getaddrinfo was successful but failed to set the addrinfo");
258
- return;
259
  }
260
 
261
  int sa_family = addresses->ai_addr->sa_family;
@@ -267,131 +245,127 @@ get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
267
  freeaddrinfo(addresses);
268
 
269
  if (MMDB_SUCCESS != mmdb_error) {
270
- char *exception_name;
271
  if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
272
- exception_name = "InvalidArgumentException";
273
  } else {
274
- exception_name = PHP_MAXMINDDB_READER_EX_NS;
275
  }
276
- THROW_EXCEPTION(exception_name,
277
- "Error looking up %s. %s",
278
- ip_address,
279
- MMDB_strerror(mmdb_error));
280
- return;
 
281
  }
282
 
283
  *prefix_len = result.netmask;
284
 
285
  if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
286
- // We return the prefix length given the IPv4 address. If there is
287
- // no IPv4 subtree, we return a prefix length of 0.
288
  *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
289
  }
290
 
291
  if (!result.found_entry) {
292
  ZVAL_NULL(record);
293
- return;
294
  }
295
 
296
  MMDB_entry_data_list_s *entry_data_list = NULL;
297
  int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
298
 
299
  if (MMDB_SUCCESS != status) {
300
- THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
301
- "Error while looking up data for %s. %s",
302
- ip_address,
303
- MMDB_strerror(status));
 
304
  MMDB_free_entry_data_list(entry_data_list);
305
- return;
306
  } else if (NULL == entry_data_list) {
307
- THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
308
- "Error while looking up data for %s. Your database may "
309
- "be corrupt or you have found a bug in libmaxminddb.",
310
- ip_address);
311
- return;
 
 
312
  }
313
 
314
- handle_entry_data_list(entry_data_list, record TSRMLS_CC);
 
 
 
 
 
 
315
  MMDB_free_entry_data_list(entry_data_list);
 
316
  }
317
 
318
- ZEND_BEGIN_ARG_INFO_EX(arginfo_maxmindbreader_void, 0, 0, 0)
319
  ZEND_END_ARG_INFO()
320
 
321
  PHP_METHOD(MaxMind_Db_Reader, metadata) {
322
- if (ZEND_NUM_ARGS() != 0) {
323
- THROW_EXCEPTION("InvalidArgumentException",
324
- "Method takes no arguments.");
 
 
 
 
325
  return;
326
  }
327
 
328
  const maxminddb_obj *const mmdb_obj =
329
- (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
330
 
331
  if (NULL == mmdb_obj->mmdb) {
332
- THROW_EXCEPTION("BadMethodCallException",
333
- "Attempt to read from a closed MaxMind DB.");
 
334
  return;
335
  }
336
 
337
- const char *const name = ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata");
338
- zend_class_entry *metadata_ce = lookup_class(name TSRMLS_CC);
339
-
340
  object_init_ex(return_value, metadata_ce);
341
 
342
- #ifdef ZEND_ENGINE_3
343
- zval _metadata_array;
344
- zval *metadata_array = &_metadata_array;
345
- ZVAL_NULL(metadata_array);
346
- #else
347
- zval *metadata_array;
348
- ALLOC_INIT_ZVAL(metadata_array);
349
- #endif
350
-
351
  MMDB_entry_data_list_s *entry_data_list;
352
  MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
353
 
354
- handle_entry_data_list(entry_data_list, metadata_array TSRMLS_CC);
 
 
 
 
 
355
  MMDB_free_entry_data_list(entry_data_list);
356
- #if PHP_VERSION_ID >= 80000
357
- zend_call_method_with_1_params(Z_OBJ_P(return_value),
358
  metadata_ce,
359
  &metadata_ce->constructor,
360
  ZEND_CONSTRUCTOR_FUNC_NAME,
361
  NULL,
362
- metadata_array);
363
- zval_ptr_dtor(metadata_array);
364
- #elif defined(ZEND_ENGINE_3)
365
- zend_call_method_with_1_params(return_value,
366
- metadata_ce,
367
- &metadata_ce->constructor,
368
- ZEND_CONSTRUCTOR_FUNC_NAME,
369
- NULL,
370
- metadata_array);
371
- zval_ptr_dtor(metadata_array);
372
- #else
373
- zend_call_method_with_1_params(&return_value,
374
- metadata_ce,
375
- &metadata_ce->constructor,
376
- ZEND_CONSTRUCTOR_FUNC_NAME,
377
- NULL,
378
- metadata_array);
379
  zval_ptr_dtor(&metadata_array);
380
- #endif
381
  }
382
 
383
  PHP_METHOD(MaxMind_Db_Reader, close) {
384
- if (ZEND_NUM_ARGS() != 0) {
385
- THROW_EXCEPTION("InvalidArgumentException",
386
- "Method takes no arguments.");
 
 
 
 
387
  return;
388
  }
389
 
390
- maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
391
 
392
  if (NULL == mmdb_obj->mmdb) {
393
- THROW_EXCEPTION("BadMethodCallException",
394
- "Attempt to close a closed MaxMind DB.");
 
395
  return;
396
  }
397
  MMDB_close(mmdb_obj->mmdb);
@@ -408,14 +382,14 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
408
  case MMDB_DATA_TYPE_ARRAY:
409
  return handle_array(entry_data_list, z_value TSRMLS_CC);
410
  case MMDB_DATA_TYPE_UTF8_STRING:
411
- _ZVAL_STRINGL(z_value,
412
- (char *)entry_data_list->entry_data.utf8_string,
413
- entry_data_list->entry_data.data_size);
414
  break;
415
  case MMDB_DATA_TYPE_BYTES:
416
- _ZVAL_STRINGL(z_value,
417
- (char *)entry_data_list->entry_data.bytes,
418
- entry_data_list->entry_data.data_size);
419
  break;
420
  case MMDB_DATA_TYPE_DOUBLE:
421
  ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
@@ -442,9 +416,10 @@ handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
442
  ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
443
  break;
444
  default:
445
- THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
446
- "Invalid data type arguments: %d",
447
- entry_data_list->entry_data.type);
 
448
  return NULL;
449
  }
450
  return entry_data_list;
@@ -456,30 +431,26 @@ handle_map(const MMDB_entry_data_list_s *entry_data_list,
456
  array_init(z_value);
457
  const uint32_t map_size = entry_data_list->entry_data.data_size;
458
 
459
- uint i;
460
  for (i = 0; i < map_size && entry_data_list; i++) {
461
  entry_data_list = entry_data_list->next;
462
 
463
  char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
464
  entry_data_list->entry_data.data_size);
465
  if (NULL == key) {
466
- THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
467
- "Invalid data type arguments");
 
468
  return NULL;
469
  }
470
 
471
  entry_data_list = entry_data_list->next;
472
- #ifdef ZEND_ENGINE_3
473
- zval _new_value;
474
- zval *new_value = &_new_value;
475
- ZVAL_NULL(new_value);
476
- #else
477
- zval *new_value;
478
- ALLOC_INIT_ZVAL(new_value);
479
- #endif
480
  entry_data_list =
481
- handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
482
- add_assoc_zval(z_value, key, new_value);
 
 
483
  efree(key);
484
  }
485
  return entry_data_list;
@@ -492,20 +463,15 @@ handle_array(const MMDB_entry_data_list_s *entry_data_list,
492
 
493
  array_init(z_value);
494
 
495
- uint i;
496
  for (i = 0; i < size && entry_data_list; i++) {
497
  entry_data_list = entry_data_list->next;
498
- #ifdef ZEND_ENGINE_3
499
- zval _new_value;
500
- zval *new_value = &_new_value;
501
- ZVAL_NULL(new_value);
502
- #else
503
- zval *new_value;
504
- ALLOC_INIT_ZVAL(new_value);
505
- #endif
506
  entry_data_list =
507
- handle_entry_data_list(entry_data_list, new_value TSRMLS_CC);
508
- add_next_index_zval(z_value, new_value);
 
 
509
  }
510
  return entry_data_list;
511
  }
@@ -532,7 +498,7 @@ static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
532
  spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
533
  CHECK_ALLOCATED(num_str);
534
 
535
- _ZVAL_STRING(z_value, num_str);
536
  efree(num_str);
537
  }
538
 
@@ -553,7 +519,7 @@ static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
553
  spprintf(&int_str, 0, "%" PRIu32, val);
554
  CHECK_ALLOCATED(int_str);
555
 
556
- _ZVAL_STRING(z_value, int_str);
557
  efree(int_str);
558
  #endif
559
  }
@@ -575,29 +541,11 @@ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
575
  spprintf(&int_str, 0, "%" PRIu64, val);
576
  CHECK_ALLOCATED(int_str);
577
 
578
- _ZVAL_STRING(z_value, int_str);
579
  efree(int_str);
580
  #endif
581
  }
582
 
583
- static zend_class_entry *lookup_class(const char *name TSRMLS_DC) {
584
- #ifdef ZEND_ENGINE_3
585
- zend_string *n = zend_string_init(name, strlen(name), 0);
586
- zend_class_entry *ce = zend_lookup_class(n);
587
- zend_string_release(n);
588
- if (NULL == ce) {
589
- zend_error(E_ERROR, "Class %s not found", name);
590
- }
591
- return ce;
592
- #else
593
- zend_class_entry **ce;
594
- if (FAILURE == zend_lookup_class(name, strlen(name), &ce TSRMLS_CC)) {
595
- zend_error(E_ERROR, "Class %s not found", name);
596
- }
597
- return *ce;
598
- #endif
599
- }
600
-
601
  static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
602
  maxminddb_obj *obj =
603
  php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
@@ -607,12 +555,8 @@ static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
607
  }
608
 
609
  zend_object_std_dtor(&obj->std TSRMLS_CC);
610
- #ifndef ZEND_ENGINE_3
611
- efree(object);
612
- #endif
613
  }
614
 
615
- #ifdef ZEND_ENGINE_3
616
  static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
617
  maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
618
  zend_object_std_init(&obj->std, type TSRMLS_CC);
@@ -622,49 +566,214 @@ static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
622
 
623
  return &obj->std;
624
  }
625
- #else
626
- static zend_object_value
627
- maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
628
- zend_object_value retval;
629
 
630
- maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
631
- zend_object_std_init(&obj->std, type TSRMLS_CC);
632
- object_properties_init(&(obj->std), type);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
633
 
634
- retval.handle = zend_objects_store_put(
635
- obj, NULL, maxminddb_free_storage, NULL TSRMLS_CC);
636
- retval.handlers = &maxminddb_obj_handlers;
 
 
 
 
 
637
 
638
- return retval;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
639
  }
640
- #endif
641
 
642
  // clang-format off
643
- static zend_function_entry maxminddb_methods[] = {
644
- PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxmindbreader_construct,
645
- ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
646
- PHP_ME(MaxMind_Db_Reader, close, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
647
- PHP_ME(MaxMind_Db_Reader, get, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
648
- PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxmindbreader_get, ZEND_ACC_PUBLIC)
649
- PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxmindbreader_void, ZEND_ACC_PUBLIC)
650
- { NULL, NULL, NULL }
651
  };
652
  // clang-format on
653
 
654
  PHP_MINIT_FUNCTION(maxminddb) {
655
  zend_class_entry ce;
656
 
 
 
 
 
657
  INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
658
  maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
659
  maxminddb_ce->create_object = maxminddb_create_handler;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
660
  memcpy(&maxminddb_obj_handlers,
661
  zend_get_std_object_handlers(),
662
  sizeof(zend_object_handlers));
663
  maxminddb_obj_handlers.clone_obj = NULL;
664
- #ifdef ZEND_ENGINE_3
665
  maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
666
  maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
667
- #endif
 
 
 
668
 
669
  return SUCCESS;
670
  }
21
  #include <zend.h>
22
 
23
  #include "Zend/zend_exceptions.h"
24
+ #include "Zend/zend_types.h"
25
+ #include "ext/spl/spl_exceptions.h"
26
  #include "ext/standard/info.h"
27
  #include <maxminddb.h>
28
 
35
 
36
  #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
37
  #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
38
+ #define PHP_MAXMINDDB_METADATA_NS \
39
+ ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata")
40
  #define PHP_MAXMINDDB_READER_EX_NS \
41
  ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "InvalidDatabaseException")
42
 
 
43
  #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
 
 
44
  typedef size_t strsize_t;
45
  typedef zend_object free_obj_t;
 
 
 
 
 
 
 
 
46
 
47
  /* For PHP 8 compatibility */
48
+ #if PHP_VERSION_ID < 80000
49
+
50
+ #define PROP_OBJ(zv) (zv)
51
+
52
+ #else
53
+
54
+ #define PROP_OBJ(zv) Z_OBJ_P(zv)
55
+
56
  #define TSRMLS_C
 
 
57
  #define TSRMLS_CC
 
 
58
  #define TSRMLS_DC
59
+
60
+ /* End PHP 8 compatibility */
61
  #endif
62
+
63
  #ifndef ZEND_ACC_CTOR
64
  #define ZEND_ACC_CTOR 0
65
  #endif
66
 
67
+ /* IS_MIXED was added in 2020 */
68
+ #ifndef IS_MIXED
69
+ #define IS_MIXED IS_UNDEF
70
+ #endif
71
+
72
  typedef struct _maxminddb_obj {
73
  MMDB_s *mmdb;
74
  zend_object std;
75
  } maxminddb_obj;
 
 
 
 
 
 
76
 
77
  PHP_FUNCTION(maxminddb);
78
 
79
+ static int
80
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len);
81
  static const MMDB_entry_data_list_s *
82
  handle_entry_data_list(const MMDB_entry_data_list_s *entry_data_list,
93
  zval *z_value TSRMLS_DC);
94
  static void handle_uint32(const MMDB_entry_data_list_s *entry_data_list,
95
  zval *z_value TSRMLS_DC);
 
96
 
97
  #define CHECK_ALLOCATED(val) \
98
  if (!val) { \
100
  return; \
101
  }
102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  static zend_object_handlers maxminddb_obj_handlers;
104
+ static zend_class_entry *maxminddb_ce, *maxminddb_exception_ce, *metadata_ce;
105
 
106
  static inline maxminddb_obj *
107
  php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC) {
 
108
  return (maxminddb_obj *)((char *)(obj)-XtOffsetOf(maxminddb_obj, std));
 
 
 
109
  }
110
 
111
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_construct, 0, 0, 1)
112
+ ZEND_ARG_TYPE_INFO(0, db_file, IS_STRING, 0)
113
  ZEND_END_ARG_INFO()
114
 
115
  PHP_METHOD(MaxMind_Db_Reader, __construct) {
124
  maxminddb_ce,
125
  &db_file,
126
  &name_len) == FAILURE) {
 
 
127
  return;
128
  }
129
 
130
  if (0 != php_check_open_basedir(db_file TSRMLS_CC) ||
131
  0 != access(db_file, R_OK)) {
132
+ zend_throw_exception_ex(
133
+ spl_ce_InvalidArgumentException,
134
+ 0 TSRMLS_CC,
135
+ "The file \"%s\" does not exist or is not readable.",
136
+ db_file);
137
  return;
138
  }
139
 
140
+ MMDB_s *mmdb = (MMDB_s *)ecalloc(1, sizeof(MMDB_s));
141
  uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
142
 
143
  if (MMDB_SUCCESS != status) {
144
+ zend_throw_exception_ex(
145
+ maxminddb_exception_ce,
146
+ 0 TSRMLS_CC,
147
+ "Error opening database file (%s). Is this a valid "
148
+ "MaxMind DB file?",
149
+ db_file);
150
  efree(mmdb);
151
  return;
152
  }
155
  mmdb_obj->mmdb = mmdb;
156
  }
157
 
158
+ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(
159
+ arginfo_maxminddbreader_get, 0, 1, IS_MIXED, 1)
160
+ ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
161
  ZEND_END_ARG_INFO()
162
 
163
  PHP_METHOD(MaxMind_Db_Reader, get) {
165
  get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, return_value, &prefix_len);
166
  }
167
 
168
+ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(
169
+ arginfo_maxminddbreader_getWithPrefixLen, 0, 1, IS_ARRAY, 1)
170
+ ZEND_ARG_TYPE_INFO(0, ip_address, IS_STRING, 0)
171
+ ZEND_END_ARG_INFO()
172
+
173
  PHP_METHOD(MaxMind_Db_Reader, getWithPrefixLen) {
174
+ zval record, z_prefix_len;
 
 
 
 
 
 
 
 
175
 
176
  int prefix_len = 0;
177
+ if (get_record(INTERNAL_FUNCTION_PARAM_PASSTHRU, &record, &prefix_len) ==
178
+ FAILURE) {
179
+ return;
180
+ }
181
 
182
  array_init(return_value);
183
+ add_next_index_zval(return_value, &record);
184
 
185
+ ZVAL_LONG(&z_prefix_len, prefix_len);
186
+ add_next_index_zval(return_value, &z_prefix_len);
187
  }
188
 
189
+ static int
190
  get_record(INTERNAL_FUNCTION_PARAMETERS, zval *record, int *prefix_len) {
191
  char *ip_address = NULL;
192
  strsize_t name_len;
193
+ zval *this_zval = NULL;
194
 
195
  if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
196
  getThis(),
197
  "Os",
198
+ &this_zval,
199
  maxminddb_ce,
200
  &ip_address,
201
  &name_len) == FAILURE) {
202
+ return FAILURE;
 
 
203
  }
204
 
205
  const maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
207
  MMDB_s *mmdb = mmdb_obj->mmdb;
208
 
209
  if (NULL == mmdb) {
210
+ zend_throw_exception_ex(spl_ce_BadMethodCallException,
211
+ 0 TSRMLS_CC,
212
+ "Attempt to read from a closed MaxMind DB.");
213
+ return FAILURE;
214
  }
215
 
216
  struct addrinfo hints = {
217
  .ai_family = AF_UNSPEC,
218
  .ai_flags = AI_NUMERICHOST,
219
+ /* We set ai_socktype so that we only get one result back */
220
  .ai_socktype = SOCK_STREAM};
221
 
222
  struct addrinfo *addresses = NULL;
223
  int gai_status = getaddrinfo(ip_address, NULL, &hints, &addresses);
224
  if (gai_status) {
225
+ zend_throw_exception_ex(spl_ce_InvalidArgumentException,
226
+ 0 TSRMLS_CC,
227
+ "The value \"%s\" is not a valid IP address.",
228
+ ip_address);
229
+ return FAILURE;
230
  }
231
  if (!addresses || !addresses->ai_addr) {
232
+ zend_throw_exception_ex(
233
+ spl_ce_InvalidArgumentException,
234
+ 0 TSRMLS_CC,
235
  "getaddrinfo was successful but failed to set the addrinfo");
236
+ return FAILURE;
237
  }
238
 
239
  int sa_family = addresses->ai_addr->sa_family;
245
  freeaddrinfo(addresses);
246
 
247
  if (MMDB_SUCCESS != mmdb_error) {
248
+ zend_class_entry *ex;
249
  if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
250
+ ex = spl_ce_InvalidArgumentException;
251
  } else {
252
+ ex = maxminddb_exception_ce;
253
  }
254
+ zend_throw_exception_ex(ex,
255
+ 0 TSRMLS_CC,
256
+ "Error looking up %s. %s",
257
+ ip_address,
258
+ MMDB_strerror(mmdb_error));
259
+ return FAILURE;
260
  }
261
 
262
  *prefix_len = result.netmask;
263
 
264
  if (sa_family == AF_INET && mmdb->metadata.ip_version == 6) {
265
+ /* We return the prefix length given the IPv4 address. If there is
266
+ no IPv4 subtree, we return a prefix length of 0. */
267
  *prefix_len = *prefix_len >= 96 ? *prefix_len - 96 : 0;
268
  }
269
 
270
  if (!result.found_entry) {
271
  ZVAL_NULL(record);
272
+ return SUCCESS;
273
  }
274
 
275
  MMDB_entry_data_list_s *entry_data_list = NULL;
276
  int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
277
 
278
  if (MMDB_SUCCESS != status) {
279
+ zend_throw_exception_ex(maxminddb_exception_ce,
280
+ 0 TSRMLS_CC,
281
+ "Error while looking up data for %s. %s",
282
+ ip_address,
283
+ MMDB_strerror(status));
284
  MMDB_free_entry_data_list(entry_data_list);
285
+ return FAILURE;
286
  } else if (NULL == entry_data_list) {
287
+ zend_throw_exception_ex(
288
+ maxminddb_exception_ce,
289
+ 0 TSRMLS_CC,
290
+ "Error while looking up data for %s. Your database may "
291
+ "be corrupt or you have found a bug in libmaxminddb.",
292
+ ip_address);
293
+ return FAILURE;
294
  }
295
 
296
+ const MMDB_entry_data_list_s *rv =
297
+ handle_entry_data_list(entry_data_list, record TSRMLS_CC);
298
+ if (rv == NULL) {
299
+ /* We should have already thrown the exception in handle_entry_data_list
300
+ */
301
+ return FAILURE;
302
+ }
303
  MMDB_free_entry_data_list(entry_data_list);
304
+ return SUCCESS;
305
  }
306
 
307
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_maxminddbreader_void, 0, 0, 0)
308
  ZEND_END_ARG_INFO()
309
 
310
  PHP_METHOD(MaxMind_Db_Reader, metadata) {
311
+ zval *this_zval = NULL;
312
+
313
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
314
+ getThis(),
315
+ "O",
316
+ &this_zval,
317
+ maxminddb_ce) == FAILURE) {
318
  return;
319
  }
320
 
321
  const maxminddb_obj *const mmdb_obj =
322
+ (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);
323
 
324
  if (NULL == mmdb_obj->mmdb) {
325
+ zend_throw_exception_ex(spl_ce_BadMethodCallException,
326
+ 0 TSRMLS_CC,
327
+ "Attempt to read from a closed MaxMind DB.");
328
  return;
329
  }
330
 
 
 
 
331
  object_init_ex(return_value, metadata_ce);
332
 
 
 
 
 
 
 
 
 
 
333
  MMDB_entry_data_list_s *entry_data_list;
334
  MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
335
 
336
+ zval metadata_array;
337
+ const MMDB_entry_data_list_s *rv =
338
+ handle_entry_data_list(entry_data_list, &metadata_array TSRMLS_CC);
339
+ if (rv == NULL) {
340
+ return;
341
+ }
342
  MMDB_free_entry_data_list(entry_data_list);
343
+ zend_call_method_with_1_params(PROP_OBJ(return_value),
 
344
  metadata_ce,
345
  &metadata_ce->constructor,
346
  ZEND_CONSTRUCTOR_FUNC_NAME,
347
  NULL,
348
+ &metadata_array);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  zval_ptr_dtor(&metadata_array);
 
350
  }
351
 
352
  PHP_METHOD(MaxMind_Db_Reader, close) {
353
+ zval *this_zval = NULL;
354
+
355
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
356
+ getThis(),
357
+ "O",
358
+ &this_zval,
359
+ maxminddb_ce) == FAILURE) {
360
  return;
361
  }
362
 
363
+ maxminddb_obj *mmdb_obj = (maxminddb_obj *)Z_MAXMINDDB_P(this_zval);
364
 
365
  if (NULL == mmdb_obj->mmdb) {
366
+ zend_throw_exception_ex(spl_ce_BadMethodCallException,
367
+ 0 TSRMLS_CC,
368
+ "Attempt to close a closed MaxMind DB.");
369
  return;
370
  }
371
  MMDB_close(mmdb_obj->mmdb);
382
  case MMDB_DATA_TYPE_ARRAY:
383
  return handle_array(entry_data_list, z_value TSRMLS_CC);
384
  case MMDB_DATA_TYPE_UTF8_STRING:
385
+ ZVAL_STRINGL(z_value,
386
+ (char *)entry_data_list->entry_data.utf8_string,
387
+ entry_data_list->entry_data.data_size);
388
  break;
389
  case MMDB_DATA_TYPE_BYTES:
390
+ ZVAL_STRINGL(z_value,
391
+ (char *)entry_data_list->entry_data.bytes,
392
+ entry_data_list->entry_data.data_size);
393
  break;
394
  case MMDB_DATA_TYPE_DOUBLE:
395
  ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
416
  ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
417
  break;
418
  default:
419
+ zend_throw_exception_ex(maxminddb_exception_ce,
420
+ 0 TSRMLS_CC,
421
+ "Invalid data type arguments: %d",
422
+ entry_data_list->entry_data.type);
423
  return NULL;
424
  }
425
  return entry_data_list;
431
  array_init(z_value);
432
  const uint32_t map_size = entry_data_list->entry_data.data_size;
433
 
434
+ uint32_t i;
435
  for (i = 0; i < map_size && entry_data_list; i++) {
436
  entry_data_list = entry_data_list->next;
437
 
438
  char *key = estrndup((char *)entry_data_list->entry_data.utf8_string,
439
  entry_data_list->entry_data.data_size);
440
  if (NULL == key) {
441
+ zend_throw_exception_ex(maxminddb_exception_ce,
442
+ 0 TSRMLS_CC,
443
+ "Invalid data type arguments");
444
  return NULL;
445
  }
446
 
447
  entry_data_list = entry_data_list->next;
448
+ zval new_value;
 
 
 
 
 
 
 
449
  entry_data_list =
450
+ handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);
451
+ if (entry_data_list != NULL) {
452
+ add_assoc_zval(z_value, key, &new_value);
453
+ }
454
  efree(key);
455
  }
456
  return entry_data_list;
463
 
464
  array_init(z_value);
465
 
466
+ uint32_t i;
467
  for (i = 0; i < size && entry_data_list; i++) {
468
  entry_data_list = entry_data_list->next;
469
+ zval new_value;
 
 
 
 
 
 
 
470
  entry_data_list =
471
+ handle_entry_data_list(entry_data_list, &new_value TSRMLS_CC);
472
+ if (entry_data_list != NULL) {
473
+ add_next_index_zval(z_value, &new_value);
474
+ }
475
  }
476
  return entry_data_list;
477
  }
498
  spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
499
  CHECK_ALLOCATED(num_str);
500
 
501
+ ZVAL_STRING(z_value, num_str);
502
  efree(num_str);
503
  }
504
 
519
  spprintf(&int_str, 0, "%" PRIu32, val);
520
  CHECK_ALLOCATED(int_str);
521
 
522
+ ZVAL_STRING(z_value, int_str);
523
  efree(int_str);
524
  #endif
525
  }
541
  spprintf(&int_str, 0, "%" PRIu64, val);
542
  CHECK_ALLOCATED(int_str);
543
 
544
+ ZVAL_STRING(z_value, int_str);
545
  efree(int_str);
546
  #endif
547
  }
548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
  static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC) {
550
  maxminddb_obj *obj =
551
  php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
555
  }
556
 
557
  zend_object_std_dtor(&obj->std TSRMLS_CC);
 
 
 
558
  }
559
 
 
560
  static zend_object *maxminddb_create_handler(zend_class_entry *type TSRMLS_DC) {
561
  maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
562
  zend_object_std_init(&obj->std, type TSRMLS_CC);
566
 
567
  return &obj->std;
568
  }
 
 
 
 
569
 
570
+ /* clang-format off */
571
+ static zend_function_entry maxminddb_methods[] = {
572
+ PHP_ME(MaxMind_Db_Reader, __construct, arginfo_maxminddbreader_construct,
573
+ ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
574
+ PHP_ME(MaxMind_Db_Reader, close, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
575
+ PHP_ME(MaxMind_Db_Reader, get, arginfo_maxminddbreader_get, ZEND_ACC_PUBLIC)
576
+ PHP_ME(MaxMind_Db_Reader, getWithPrefixLen, arginfo_maxminddbreader_getWithPrefixLen, ZEND_ACC_PUBLIC)
577
+ PHP_ME(MaxMind_Db_Reader, metadata, arginfo_maxminddbreader_void, ZEND_ACC_PUBLIC)
578
+ { NULL, NULL, NULL }
579
+ };
580
+ /* clang-format on */
581
+
582
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_metadata_construct, 0, 0, 1)
583
+ ZEND_ARG_TYPE_INFO(0, metadata, IS_ARRAY, 0)
584
+ ZEND_END_ARG_INFO()
585
+
586
+ PHP_METHOD(MaxMind_Db_Reader_Metadata, __construct) {
587
+ zval *object = NULL;
588
+ zval *metadata_array = NULL;
589
+ zend_long node_count = 0;
590
+ zend_long record_size = 0;
591
+
592
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
593
+ getThis(),
594
+ "Oa",
595
+ &object,
596
+ metadata_ce,
597
+ &metadata_array) == FAILURE) {
598
+ return;
599
+ }
600
+
601
+ zval *tmp = NULL;
602
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
603
+ "binary_format_major_version",
604
+ sizeof("binary_format_major_version") - 1))) {
605
+ zend_update_property(metadata_ce,
606
+ PROP_OBJ(object),
607
+ "binaryFormatMajorVersion",
608
+ sizeof("binaryFormatMajorVersion") - 1,
609
+ tmp);
610
+ }
611
+
612
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
613
+ "binary_format_minor_version",
614
+ sizeof("binary_format_minor_version") - 1))) {
615
+ zend_update_property(metadata_ce,
616
+ PROP_OBJ(object),
617
+ "binaryFormatMinorVersion",
618
+ sizeof("binaryFormatMinorVersion") - 1,
619
+ tmp);
620
+ }
621
+
622
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
623
+ "build_epoch",
624
+ sizeof("build_epoch") - 1))) {
625
+ zend_update_property(metadata_ce,
626
+ PROP_OBJ(object),
627
+ "buildEpoch",
628
+ sizeof("buildEpoch") - 1,
629
+ tmp);
630
+ }
631
+
632
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
633
+ "database_type",
634
+ sizeof("database_type") - 1))) {
635
+ zend_update_property(metadata_ce,
636
+ PROP_OBJ(object),
637
+ "databaseType",
638
+ sizeof("databaseType") - 1,
639
+ tmp);
640
+ }
641
+
642
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
643
+ "description",
644
+ sizeof("description") - 1))) {
645
+ zend_update_property(metadata_ce,
646
+ PROP_OBJ(object),
647
+ "description",
648
+ sizeof("description") - 1,
649
+ tmp);
650
+ }
651
+
652
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
653
+ "ip_version",
654
+ sizeof("ip_version") - 1))) {
655
+ zend_update_property(metadata_ce,
656
+ PROP_OBJ(object),
657
+ "ipVersion",
658
+ sizeof("ipVersion") - 1,
659
+ tmp);
660
+ }
661
 
662
+ if ((tmp = zend_hash_str_find(
663
+ HASH_OF(metadata_array), "languages", sizeof("languages") - 1))) {
664
+ zend_update_property(metadata_ce,
665
+ PROP_OBJ(object),
666
+ "languages",
667
+ sizeof("languages") - 1,
668
+ tmp);
669
+ }
670
 
671
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
672
+ "record_size",
673
+ sizeof("record_size") - 1))) {
674
+ zend_update_property(metadata_ce,
675
+ PROP_OBJ(object),
676
+ "recordSize",
677
+ sizeof("recordSize") - 1,
678
+ tmp);
679
+ if (Z_TYPE_P(tmp) == IS_LONG) {
680
+ record_size = Z_LVAL_P(tmp);
681
+ }
682
+ }
683
+
684
+ if (record_size != 0) {
685
+ zend_update_property_long(metadata_ce,
686
+ PROP_OBJ(object),
687
+ "nodeByteSize",
688
+ sizeof("nodeByteSize") - 1,
689
+ record_size / 4);
690
+ }
691
+
692
+ if ((tmp = zend_hash_str_find(HASH_OF(metadata_array),
693
+ "node_count",
694
+ sizeof("node_count") - 1))) {
695
+ zend_update_property(metadata_ce,
696
+ PROP_OBJ(object),
697
+ "nodeCount",
698
+ sizeof("nodeCount") - 1,
699
+ tmp);
700
+ if (Z_TYPE_P(tmp) == IS_LONG) {
701
+ node_count = Z_LVAL_P(tmp);
702
+ }
703
+ }
704
+
705
+ if (record_size != 0) {
706
+ zend_update_property_long(metadata_ce,
707
+ PROP_OBJ(object),
708
+ "searchTreeSize",
709
+ sizeof("searchTreeSize") - 1,
710
+ record_size * node_count / 4);
711
+ }
712
  }
 
713
 
714
  // clang-format off
715
+ static zend_function_entry metadata_methods[] = {
716
+ PHP_ME(MaxMind_Db_Reader_Metadata, __construct, arginfo_metadata_construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
717
+ {NULL, NULL, NULL}
 
 
 
 
 
718
  };
719
  // clang-format on
720
 
721
  PHP_MINIT_FUNCTION(maxminddb) {
722
  zend_class_entry ce;
723
 
724
+ INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_EX_NS, NULL);
725
+ maxminddb_exception_ce =
726
+ zend_register_internal_class_ex(&ce, zend_ce_exception);
727
+
728
  INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
729
  maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
730
  maxminddb_ce->create_object = maxminddb_create_handler;
731
+
732
+ INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_METADATA_NS, metadata_methods);
733
+ metadata_ce = zend_register_internal_class(&ce TSRMLS_CC);
734
+ zend_declare_property_null(metadata_ce,
735
+ "binaryFormatMajorVersion",
736
+ sizeof("binaryFormatMajorVersion") - 1,
737
+ ZEND_ACC_PUBLIC);
738
+ zend_declare_property_null(metadata_ce,
739
+ "binaryFormatMinorVersion",
740
+ sizeof("binaryFormatMinorVersion") - 1,
741
+ ZEND_ACC_PUBLIC);
742
+ zend_declare_property_null(
743
+ metadata_ce, "buildEpoch", sizeof("buildEpoch") - 1, ZEND_ACC_PUBLIC);
744
+ zend_declare_property_null(metadata_ce,
745
+ "databaseType",
746
+ sizeof("databaseType") - 1,
747
+ ZEND_ACC_PUBLIC);
748
+ zend_declare_property_null(
749
+ metadata_ce, "description", sizeof("description") - 1, ZEND_ACC_PUBLIC);
750
+ zend_declare_property_null(
751
+ metadata_ce, "ipVersion", sizeof("ipVersion") - 1, ZEND_ACC_PUBLIC);
752
+ zend_declare_property_null(
753
+ metadata_ce, "languages", sizeof("languages") - 1, ZEND_ACC_PUBLIC);
754
+ zend_declare_property_null(metadata_ce,
755
+ "nodeByteSize",
756
+ sizeof("nodeByteSize") - 1,
757
+ ZEND_ACC_PUBLIC);
758
+ zend_declare_property_null(
759
+ metadata_ce, "nodeCount", sizeof("nodeCount") - 1, ZEND_ACC_PUBLIC);
760
+ zend_declare_property_null(
761
+ metadata_ce, "recordSize", sizeof("recordSize") - 1, ZEND_ACC_PUBLIC);
762
+ zend_declare_property_null(metadata_ce,
763
+ "searchTreeSize",
764
+ sizeof("searchTreeSize") - 1,
765
+ ZEND_ACC_PUBLIC);
766
+
767
  memcpy(&maxminddb_obj_handlers,
768
  zend_get_std_object_handlers(),
769
  sizeof(zend_object_handlers));
770
  maxminddb_obj_handlers.clone_obj = NULL;
 
771
  maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
772
  maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
773
+ zend_declare_class_constant_string(maxminddb_ce,
774
+ "MMDB_LIB_VERSION",
775
+ sizeof("MMDB_LIB_VERSION") - 1,
776
+ MMDB_lib_version() TSRMLS_CC);
777
 
778
  return SUCCESS;
779
  }
vendor/maxmind-db/reader/ext/php_maxminddb.h CHANGED
@@ -15,7 +15,7 @@
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
- #define PHP_MAXMINDDB_VERSION "1.5.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
+ #define PHP_MAXMINDDB_VERSION "1.10.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
vendor/maxmind-db/reader/package.xml ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package version="2.0" xmlns="http://pear.php.net/dtd/package-2.0"
3
+ xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
6
+
7
+ <name>maxminddb</name>
8
+ <channel>pecl.php.net</channel>
9
+ <summary>Reader for the MaxMind DB file format</summary>
10
+ <description>This is the PHP extension for reading MaxMind DB files. MaxMind DB is a binary file format that stores data indexed by IP address subnets (IPv4 or IPv6).</description>
11
+ <lead>
12
+ <name>Greg Oschwald</name>
13
+ <user>oschwald</user>
14
+ <email>goschwald@maxmind.com</email>
15
+ <active>yes</active>
16
+ </lead>
17
+ <date>2021-02-09</date>
18
+ <version>
19
+ <release>1.10.0</release>
20
+ <api>1.10.0</api>
21
+ </version>
22
+ <stability>
23
+ <release>stable</release>
24
+ <api>stable</api>
25
+ </stability>
26
+ <license uri="https://github.com/maxmind/MaxMind-DB-Reader-php/blob/main/LICENSE">Apache License 2.0</license>
27
+ <notes>* When using the pure PHP reader, unsigned integers up to PHP_MAX_INT
28
+ will now be integers in PHP rather than strings. Previously integers
29
+ greater than 2^24 on 32-bit platforms and 2^56 on 64-bit platforms
30
+ would be strings due to the use of `gmp` or `bcmath` to decode them.
31
+ Reported by Alejandro Celaya. GitHub #119.</notes>
32
+ <contents>
33
+ <dir name="/">
34
+ <file role="doc" name="LICENSE"/>
35
+ <file role="doc" name="CHANGELOG.md"/>
36
+ <file role="doc" name="README.md"/>
37
+
38
+ <dir name="ext">
39
+ <file role="src" name="config.m4"/>
40
+ <file role="src" name="config.w32"/>
41
+
42
+ <file role="src" name="maxminddb.c"/>
43
+ <file role="src" name="php_maxminddb.h"/>
44
+
45
+ <dir name="tests">
46
+ <file role="test" name="001-load.phpt"/>
47
+ <file role="test" name="002-final.phpt"/>
48
+ <file role="test" name="003-open-basedir.phpt"/>
49
+ </dir>
50
+ </dir>
51
+ </dir>
52
+ </contents>
53
+ <dependencies>
54
+ <required>
55
+ <php>
56
+ <min>7.2.0</min>
57
+ </php>
58
+ <pearinstaller>
59
+ <min>1.10.0</min>
60
+ </pearinstaller>
61
+ </required>
62
+ </dependencies>
63
+ <providesextension>maxminddb</providesextension>
64
+ <extsrcrelease />
65
+ </package>
vendor/maxmind-db/reader/phpstan.neon ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ parameters:
2
+ level: 6
3
+ paths:
4
+ - src
5
+ - tests
6
+ checkMissingIterableValueType: false
7
+
vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php CHANGED
@@ -1,7 +1,10 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db;
4
 
 
5
  use BadMethodCallException;
6
  use Exception;
7
  use InvalidArgumentException;
@@ -17,15 +20,42 @@ use UnexpectedValueException;
17
  */
18
  class Reader
19
  {
 
 
 
20
  private static $DATA_SECTION_SEPARATOR_SIZE = 16;
 
 
 
21
  private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
 
 
 
22
  private static $METADATA_START_MARKER_LENGTH = 14;
23
- private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KB
 
 
 
24
 
 
 
 
25
  private $decoder;
 
 
 
26
  private $fileHandle;
 
 
 
27
  private $fileSize;
 
 
 
28
  private $ipV4Start;
 
 
 
29
  private $metadata;
30
 
31
  /**
@@ -35,40 +65,38 @@ class Reader
35
  * @param string $database
36
  * the MaxMind DB file to use
37
  *
38
- * @throws InvalidArgumentException for invalid database path or unknown arguments
39
- * @throws \MaxMind\Db\Reader\InvalidDatabaseException
40
- * if the database is invalid or there is an error reading
41
- * from it
42
  */
43
- public function __construct($database)
44
  {
45
  if (\func_num_args() !== 1) {
46
- throw new InvalidArgumentException(
47
- 'The constructor takes exactly one argument.'
48
  );
49
  }
50
 
51
- if (!is_readable($database)) {
 
52
  throw new InvalidArgumentException(
53
  "The file \"$database\" does not exist or is not readable."
54
  );
55
  }
56
- $this->fileHandle = @fopen($database, 'rb');
57
- if ($this->fileHandle === false) {
58
- throw new InvalidArgumentException(
59
- "Error opening \"$database\"."
60
- );
61
- }
62
- $this->fileSize = @filesize($database);
63
- if ($this->fileSize === false) {
64
  throw new UnexpectedValueException(
65
  "Error determining the size of \"$database\"."
66
  );
67
  }
 
68
 
69
  $start = $this->findMetadataStart($database);
70
  $metadataDecoder = new Decoder($this->fileHandle, $start);
71
- list($metadataArray) = $metadataDecoder->decode($start);
72
  $this->metadata = new Metadata($metadataArray);
73
  $this->decoder = new Decoder(
74
  $this->fileHandle,
@@ -91,14 +119,14 @@ class Reader
91
  *
92
  * @return mixed the record for the IP address
93
  */
94
- public function get($ipAddress)
95
  {
96
  if (\func_num_args() !== 1) {
97
- throw new InvalidArgumentException(
98
- 'Method takes exactly one argument.'
99
  );
100
  }
101
- list($record) = $this->getWithPrefixLen($ipAddress);
102
 
103
  return $record;
104
  }
@@ -118,11 +146,11 @@ class Reader
118
  * @return array an array where the first element is the record and the
119
  * second the network prefix length for the record
120
  */
121
- public function getWithPrefixLen($ipAddress)
122
  {
123
  if (\func_num_args() !== 1) {
124
- throw new InvalidArgumentException(
125
- 'Method takes exactly one argument.'
126
  );
127
  }
128
 
@@ -132,13 +160,7 @@ class Reader
132
  );
133
  }
134
 
135
- if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
136
- throw new InvalidArgumentException(
137
- "The value \"$ipAddress\" is not a valid IP address."
138
- );
139
- }
140
-
141
- list($pointer, $prefixLen) = $this->findAddressInTree($ipAddress);
142
  if ($pointer === 0) {
143
  return [null, $prefixLen];
144
  }
@@ -146,9 +168,16 @@ class Reader
146
  return [$this->resolveDataPointer($pointer), $prefixLen];
147
  }
148
 
149
- private function findAddressInTree($ipAddress)
150
  {
151
- $rawAddress = unpack('C*', inet_pton($ipAddress));
 
 
 
 
 
 
 
152
 
153
  $bitCount = \count($rawAddress) * 8;
154
 
@@ -182,14 +211,18 @@ class Reader
182
  if ($node === $nodeCount) {
183
  // Record is empty
184
  return [0, $i];
185
- } elseif ($node > $nodeCount) {
 
186
  // Record is a data pointer
187
  return [$node, $i];
188
  }
189
- throw new InvalidDatabaseException('Something bad happened');
 
 
 
190
  }
191
 
192
- private function ipV4StartNode()
193
  {
194
  // If we have an IPv4 database, the start node is the first node
195
  if ($this->metadata->ipVersion === 4) {
@@ -205,16 +238,17 @@ class Reader
205
  return $node;
206
  }
207
 
208
- private function readNode($nodeNumber, $index)
209
  {
210
  $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
211
 
212
  switch ($this->metadata->recordSize) {
213
  case 24:
214
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
215
- list(, $node) = unpack('N', "\x00" . $bytes);
216
 
217
  return $node;
 
218
  case 28:
219
  $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
220
  if ($index === 0) {
@@ -222,14 +256,16 @@ class Reader
222
  } else {
223
  $middle = 0x0F & \ord($bytes[0]);
224
  }
225
- list(, $node) = unpack('N', \chr($middle) . substr($bytes, $index, 3));
226
 
227
  return $node;
 
228
  case 32:
229
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
230
- list(, $node) = unpack('N', $bytes);
231
 
232
  return $node;
 
233
  default:
234
  throw new InvalidDatabaseException(
235
  'Unknown record size: '
@@ -238,17 +274,20 @@ class Reader
238
  }
239
  }
240
 
241
- private function resolveDataPointer($pointer)
 
 
 
242
  {
243
  $resolved = $pointer - $this->metadata->nodeCount
244
  + $this->metadata->searchTreeSize;
245
- if ($resolved > $this->fileSize) {
246
  throw new InvalidDatabaseException(
247
  "The MaxMind DB file's search tree is corrupt"
248
  );
249
  }
250
 
251
- list($data) = $this->decoder->decode($resolved);
252
 
253
  return $data;
254
  }
@@ -258,27 +297,27 @@ class Reader
258
  * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
259
  * an issue, but I suspect it won't be.
260
  */
261
- private function findMetadataStart($filename)
262
  {
263
  $handle = $this->fileHandle;
264
  $fstat = fstat($handle);
265
  $fileSize = $fstat['size'];
266
  $marker = self::$METADATA_START_MARKER;
267
  $markerLength = self::$METADATA_START_MARKER_LENGTH;
268
- $metadataMaxLengthExcludingMarker
269
- = min(self::$METADATA_MAX_SIZE, $fileSize) - $markerLength;
270
-
271
- for ($i = 0; $i <= $metadataMaxLengthExcludingMarker; ++$i) {
272
- for ($j = 0; $j < $markerLength; ++$j) {
273
- fseek($handle, $fileSize - $i - $j - 1);
274
- $matchBit = fgetc($handle);
275
- if ($matchBit !== $marker[$markerLength - $j - 1]) {
276
- continue 2;
277
- }
278
  }
279
 
280
- return $fileSize - $i;
 
 
 
281
  }
 
282
  throw new InvalidDatabaseException(
283
  "Error opening database file ($filename). " .
284
  'Is this a valid MaxMind DB file?'
@@ -291,11 +330,11 @@ class Reader
291
  *
292
  * @return Metadata object for the database
293
  */
294
- public function metadata()
295
  {
296
  if (\func_num_args()) {
297
- throw new InvalidArgumentException(
298
- 'Method takes no arguments.'
299
  );
300
  }
301
 
@@ -307,7 +346,7 @@ class Reader
307
  );
308
  }
309
 
310
- return $this->metadata;
311
  }
312
 
313
  /**
@@ -316,8 +355,14 @@ class Reader
316
  * @throws Exception
317
  * if an I/O error occurs
318
  */
319
- public function close()
320
  {
 
 
 
 
 
 
321
  if (!\is_resource($this->fileHandle)) {
322
  throw new BadMethodCallException(
323
  'Attempt to close a closed MaxMind DB.'
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Db;
6
 
7
+ use ArgumentCountError;
8
  use BadMethodCallException;
9
  use Exception;
10
  use InvalidArgumentException;
20
  */
21
  class Reader
22
  {
23
+ /**
24
+ * @var int
25
+ */
26
  private static $DATA_SECTION_SEPARATOR_SIZE = 16;
27
+ /**
28
+ * @var string
29
+ */
30
  private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
31
+ /**
32
+ * @var int
33
+ */
34
  private static $METADATA_START_MARKER_LENGTH = 14;
35
+ /**
36
+ * @var int
37
+ */
38
+ private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KiB
39
 
40
+ /**
41
+ * @var Decoder
42
+ */
43
  private $decoder;
44
+ /**
45
+ * @var resource
46
+ */
47
  private $fileHandle;
48
+ /**
49
+ * @var int
50
+ */
51
  private $fileSize;
52
+ /**
53
+ * @var int
54
+ */
55
  private $ipV4Start;
56
+ /**
57
+ * @var Metadata
58
+ */
59
  private $metadata;
60
 
61
  /**
65
  * @param string $database
66
  * the MaxMind DB file to use
67
  *
68
+ * @throws InvalidArgumentException for invalid database path or unknown arguments
69
+ * @throws InvalidDatabaseException
70
+ * if the database is invalid or there is an error reading
71
+ * from it
72
  */
73
+ public function __construct(string $database)
74
  {
75
  if (\func_num_args() !== 1) {
76
+ throw new ArgumentCountError(
77
+ sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
78
  );
79
  }
80
 
81
+ $fileHandle = @fopen($database, 'rb');
82
+ if ($fileHandle === false) {
83
  throw new InvalidArgumentException(
84
  "The file \"$database\" does not exist or is not readable."
85
  );
86
  }
87
+ $this->fileHandle = $fileHandle;
88
+
89
+ $fileSize = @filesize($database);
90
+ if ($fileSize === false) {
 
 
 
 
91
  throw new UnexpectedValueException(
92
  "Error determining the size of \"$database\"."
93
  );
94
  }
95
+ $this->fileSize = $fileSize;
96
 
97
  $start = $this->findMetadataStart($database);
98
  $metadataDecoder = new Decoder($this->fileHandle, $start);
99
+ [$metadataArray] = $metadataDecoder->decode($start);
100
  $this->metadata = new Metadata($metadataArray);
101
  $this->decoder = new Decoder(
102
  $this->fileHandle,
119
  *
120
  * @return mixed the record for the IP address
121
  */
122
+ public function get(string $ipAddress)
123
  {
124
  if (\func_num_args() !== 1) {
125
+ throw new ArgumentCountError(
126
+ sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
127
  );
128
  }
129
+ [$record] = $this->getWithPrefixLen($ipAddress);
130
 
131
  return $record;
132
  }
146
  * @return array an array where the first element is the record and the
147
  * second the network prefix length for the record
148
  */
149
+ public function getWithPrefixLen(string $ipAddress): array
150
  {
151
  if (\func_num_args() !== 1) {
152
+ throw new ArgumentCountError(
153
+ sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
154
  );
155
  }
156
 
160
  );
161
  }
162
 
163
+ [$pointer, $prefixLen] = $this->findAddressInTree($ipAddress);
 
 
 
 
 
 
164
  if ($pointer === 0) {
165
  return [null, $prefixLen];
166
  }
168
  return [$this->resolveDataPointer($pointer), $prefixLen];
169
  }
170
 
171
+ private function findAddressInTree(string $ipAddress): array
172
  {
173
+ $packedAddr = @inet_pton($ipAddress);
174
+ if ($packedAddr === false) {
175
+ throw new InvalidArgumentException(
176
+ "The value \"$ipAddress\" is not a valid IP address."
177
+ );
178
+ }
179
+
180
+ $rawAddress = unpack('C*', $packedAddr);
181
 
182
  $bitCount = \count($rawAddress) * 8;
183
 
211
  if ($node === $nodeCount) {
212
  // Record is empty
213
  return [0, $i];
214
+ }
215
+ if ($node > $nodeCount) {
216
  // Record is a data pointer
217
  return [$node, $i];
218
  }
219
+
220
+ throw new InvalidDatabaseException(
221
+ 'Invalid or corrupt database. Maximum search depth reached without finding a leaf node'
222
+ );
223
  }
224
 
225
+ private function ipV4StartNode(): int
226
  {
227
  // If we have an IPv4 database, the start node is the first node
228
  if ($this->metadata->ipVersion === 4) {
238
  return $node;
239
  }
240
 
241
+ private function readNode(int $nodeNumber, int $index): int
242
  {
243
  $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
244
 
245
  switch ($this->metadata->recordSize) {
246
  case 24:
247
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
248
+ [, $node] = unpack('N', "\x00" . $bytes);
249
 
250
  return $node;
251
+
252
  case 28:
253
  $bytes = Util::read($this->fileHandle, $baseOffset + 3 * $index, 4);
254
  if ($index === 0) {
256
  } else {
257
  $middle = 0x0F & \ord($bytes[0]);
258
  }
259
+ [, $node] = unpack('N', \chr($middle) . substr($bytes, $index, 3));
260
 
261
  return $node;
262
+
263
  case 32:
264
  $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
265
+ [, $node] = unpack('N', $bytes);
266
 
267
  return $node;
268
+
269
  default:
270
  throw new InvalidDatabaseException(
271
  'Unknown record size: '
274
  }
275
  }
276
 
277
+ /**
278
+ * @return mixed
279
+ */
280
+ private function resolveDataPointer(int $pointer)
281
  {
282
  $resolved = $pointer - $this->metadata->nodeCount
283
  + $this->metadata->searchTreeSize;
284
+ if ($resolved >= $this->fileSize) {
285
  throw new InvalidDatabaseException(
286
  "The MaxMind DB file's search tree is corrupt"
287
  );
288
  }
289
 
290
+ [$data] = $this->decoder->decode($resolved);
291
 
292
  return $data;
293
  }
297
  * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
298
  * an issue, but I suspect it won't be.
299
  */
300
+ private function findMetadataStart(string $filename): int
301
  {
302
  $handle = $this->fileHandle;
303
  $fstat = fstat($handle);
304
  $fileSize = $fstat['size'];
305
  $marker = self::$METADATA_START_MARKER;
306
  $markerLength = self::$METADATA_START_MARKER_LENGTH;
307
+
308
+ $minStart = $fileSize - min(self::$METADATA_MAX_SIZE, $fileSize);
309
+
310
+ for ($offset = $fileSize - $markerLength; $offset >= $minStart; --$offset) {
311
+ if (fseek($handle, $offset) !== 0) {
312
+ break;
 
 
 
 
313
  }
314
 
315
+ $value = fread($handle, $markerLength);
316
+ if ($value === $marker) {
317
+ return $offset + $markerLength;
318
+ }
319
  }
320
+
321
  throw new InvalidDatabaseException(
322
  "Error opening database file ($filename). " .
323
  'Is this a valid MaxMind DB file?'
330
  *
331
  * @return Metadata object for the database
332
  */
333
+ public function metadata(): Metadata
334
  {
335
  if (\func_num_args()) {
336
+ throw new ArgumentCountError(
337
+ sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args())
338
  );
339
  }
340
 
346
  );
347
  }
348
 
349
+ return clone $this->metadata;
350
  }
351
 
352
  /**
355
  * @throws Exception
356
  * if an I/O error occurs
357
  */
358
+ public function close(): void
359
  {
360
+ if (\func_num_args()) {
361
+ throw new ArgumentCountError(
362
+ sprintf('%s() expects exactly 0 parameters, %d given', __METHOD__, \func_num_args())
363
+ );
364
+ }
365
+
366
  if (!\is_resource($this->fileHandle)) {
367
  throw new BadMethodCallException(
368
  'Attempt to close a closed MaxMind DB.'
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php CHANGED
@@ -1,63 +1,68 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  // @codingStandardsIgnoreLine
6
  use RuntimeException;
7
 
8
- /**
9
  * @ignore
10
  *
11
  * We subtract 1 from the log to protect against precision loss.
12
  */
13
- \define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (log(PHP_INT_MAX, 2) - 1) / 8);
14
 
15
  class Decoder
16
  {
 
 
 
17
  private $fileStream;
 
 
 
18
  private $pointerBase;
 
 
 
19
  private $pointerBaseByteSize;
20
- // This is only used for unit testing
 
 
 
 
21
  private $pointerTestHack;
 
 
 
22
  private $switchByteOrder;
23
 
24
- /** @ignore */
25
- const _EXTENDED = 0;
26
- /** @ignore */
27
- const _POINTER = 1;
28
- /** @ignore */
29
- const _UTF8_STRING = 2;
30
- /** @ignore */
31
- const _DOUBLE = 3;
32
- /** @ignore */
33
- const _BYTES = 4;
34
- /** @ignore */
35
- const _UINT16 = 5;
36
- /** @ignore */
37
- const _UINT32 = 6;
38
- /** @ignore */
39
- const _MAP = 7;
40
- /** @ignore */
41
- const _INT32 = 8;
42
- /** @ignore */
43
- const _UINT64 = 9;
44
- /** @ignore */
45
- const _UINT128 = 10;
46
- /** @ignore */
47
- const _ARRAY = 11;
48
- /** @ignore */
49
- const _CONTAINER = 12;
50
- /** @ignore */
51
- const _END_MARKER = 13;
52
- /** @ignore */
53
- const _BOOLEAN = 14;
54
- /** @ignore */
55
- const _FLOAT = 15;
56
-
57
  public function __construct(
58
  $fileStream,
59
- $pointerBase = 0,
60
- $pointerTestHack = false
61
  ) {
62
  $this->fileStream = $fileStream;
63
  $this->pointerBase = $pointerBase;
@@ -68,12 +73,9 @@ class Decoder
68
  $this->switchByteOrder = $this->isPlatformLittleEndian();
69
  }
70
 
71
- public function decode($offset)
72
  {
73
- list(, $ctrlByte) = unpack(
74
- 'C',
75
- Util::read($this->fileStream, $offset, 1)
76
- );
77
  ++$offset;
78
 
79
  $type = $ctrlByte >> 5;
@@ -82,23 +84,20 @@ class Decoder
82
  // use the size to determine the length of the pointer and then follow
83
  // it.
84
  if ($type === self::_POINTER) {
85
- list($pointer, $offset) = $this->decodePointer($ctrlByte, $offset);
86
 
87
  // for unit testing
88
  if ($this->pointerTestHack) {
89
  return [$pointer];
90
  }
91
 
92
- list($result) = $this->decode($pointer);
93
 
94
  return [$result, $offset];
95
  }
96
 
97
  if ($type === self::_EXTENDED) {
98
- list(, $nextByte) = unpack(
99
- 'C',
100
- Util::read($this->fileStream, $offset, 1)
101
- );
102
 
103
  $type = $nextByte + 7;
104
 
@@ -114,43 +113,51 @@ class Decoder
114
  ++$offset;
115
  }
116
 
117
- list($size, $offset) = $this->sizeFromCtrlByte($ctrlByte, $offset);
118
 
119
  return $this->decodeByType($type, $offset, $size);
120
  }
121
 
122
- private function decodeByType($type, $offset, $size)
123
  {
124
  switch ($type) {
125
  case self::_MAP:
126
  return $this->decodeMap($size, $offset);
 
127
  case self::_ARRAY:
128
  return $this->decodeArray($size, $offset);
 
129
  case self::_BOOLEAN:
130
  return [$this->decodeBoolean($size), $offset];
131
  }
132
 
133
  $newOffset = $offset + $size;
134
  $bytes = Util::read($this->fileStream, $offset, $size);
 
135
  switch ($type) {
136
  case self::_BYTES:
137
  case self::_UTF8_STRING:
138
  return [$bytes, $newOffset];
 
139
  case self::_DOUBLE:
140
  $this->verifySize(8, $size);
141
 
142
  return [$this->decodeDouble($bytes), $newOffset];
 
143
  case self::_FLOAT:
144
  $this->verifySize(4, $size);
145
 
146
  return [$this->decodeFloat($bytes), $newOffset];
 
147
  case self::_INT32:
148
  return [$this->decodeInt32($bytes, $size), $newOffset];
 
149
  case self::_UINT16:
150
  case self::_UINT32:
151
  case self::_UINT64:
152
  case self::_UINT128:
153
  return [$this->decodeUint($bytes, $size), $newOffset];
 
154
  default:
155
  throw new InvalidDatabaseException(
156
  'Unknown or unexpected type: ' . $type
@@ -158,7 +165,7 @@ class Decoder
158
  }
159
  }
160
 
161
- private function verifySize($expected, $actual)
162
  {
163
  if ($expected !== $actual) {
164
  throw new InvalidDatabaseException(
@@ -167,86 +174,82 @@ class Decoder
167
  }
168
  }
169
 
170
- private function decodeArray($size, $offset)
171
  {
172
  $array = [];
173
 
174
  for ($i = 0; $i < $size; ++$i) {
175
- list($value, $offset) = $this->decode($offset);
176
- array_push($array, $value);
177
  }
178
 
179
  return [$array, $offset];
180
  }
181
 
182
- private function decodeBoolean($size)
183
  {
184
- return $size === 0 ? false : true;
185
  }
186
 
187
- private function decodeDouble($bits)
188
  {
189
  // This assumes IEEE 754 doubles, but most (all?) modern platforms
190
  // use them.
191
- //
192
- // We are not using the "E" format as that was only added in
193
- // 7.0.15 and 7.1.1. As such, we must switch byte order on
194
- // little endian machines.
195
- list(, $double) = unpack('d', $this->maybeSwitchByteOrder($bits));
196
 
197
  return $double;
198
  }
199
 
200
- private function decodeFloat($bits)
201
  {
202
  // This assumes IEEE 754 floats, but most (all?) modern platforms
203
  // use them.
204
- //
205
- // We are not using the "G" format as that was only added in
206
- // 7.0.15 and 7.1.1. As such, we must switch byte order on
207
- // little endian machines.
208
- list(, $float) = unpack('f', $this->maybeSwitchByteOrder($bits));
209
 
210
  return $float;
211
  }
212
 
213
- private function decodeInt32($bytes, $size)
214
  {
215
  switch ($size) {
216
  case 0:
217
  return 0;
 
218
  case 1:
219
  case 2:
220
  case 3:
221
- $bytes = str_pad($bytes, 4, "\x00", STR_PAD_LEFT);
 
222
  break;
 
223
  case 4:
224
  break;
 
225
  default:
226
  throw new InvalidDatabaseException(
227
  "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
228
  );
229
  }
230
 
231
- list(, $int) = unpack('l', $this->maybeSwitchByteOrder($bytes));
232
 
233
  return $int;
234
  }
235
 
236
- private function decodeMap($size, $offset)
237
  {
238
  $map = [];
239
 
240
  for ($i = 0; $i < $size; ++$i) {
241
- list($key, $offset) = $this->decode($offset);
242
- list($value, $offset) = $this->decode($offset);
243
  $map[$key] = $value;
244
  }
245
 
246
  return [$map, $offset];
247
  }
248
 
249
- private function decodePointer($ctrlByte, $offset)
250
  {
251
  $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
252
 
@@ -255,23 +258,29 @@ class Decoder
255
 
256
  switch ($pointerSize) {
257
  case 1:
258
- $packed = (pack('C', $ctrlByte & 0x7)) . $buffer;
259
- list(, $pointer) = unpack('n', $packed);
260
  $pointer += $this->pointerBase;
 
261
  break;
 
262
  case 2:
263
- $packed = "\x00" . (pack('C', $ctrlByte & 0x7)) . $buffer;
264
- list(, $pointer) = unpack('N', $packed);
265
  $pointer += $this->pointerBase + 2048;
 
266
  break;
 
267
  case 3:
268
- $packed = (pack('C', $ctrlByte & 0x7)) . $buffer;
269
 
270
  // It is safe to use 'N' here, even on 32 bit machines as the
271
  // first bit is 0.
272
- list(, $pointer) = unpack('N', $packed);
273
  $pointer += $this->pointerBase + 526336;
 
274
  break;
 
275
  case 4:
276
  // We cannot use unpack here as we might overflow on 32 bit
277
  // machines
@@ -284,18 +293,26 @@ class Decoder
284
  } elseif (\extension_loaded('gmp')) {
285
  $pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
286
  } elseif (\extension_loaded('bcmath')) {
287
- $pointer = bcadd($pointerOffset, $this->pointerBase);
288
  } else {
289
  throw new RuntimeException(
290
  'The gmp or bcmath extension must be installed to read this database.'
291
  );
292
  }
 
 
 
 
 
 
 
293
  }
294
 
295
  return [$pointer, $offset];
296
  }
297
 
298
- private function decodeUint($bytes, $byteLength)
 
299
  {
300
  if ($byteLength === 0) {
301
  return 0;
@@ -303,16 +320,22 @@ class Decoder
303
 
304
  $integer = 0;
305
 
 
 
 
 
 
 
306
  for ($i = 0; $i < $byteLength; ++$i) {
307
  $part = \ord($bytes[$i]);
308
 
309
  // We only use gmp or bcmath if the final value is too big
310
- if ($byteLength <= _MM_MAX_INT_BYTES) {
311
  $integer = ($integer << 8) + $part;
312
  } elseif (\extension_loaded('gmp')) {
313
- $integer = gmp_strval(gmp_add(gmp_mul($integer, 256), $part));
314
  } elseif (\extension_loaded('bcmath')) {
315
- $integer = bcadd(bcmul($integer, 256), $part);
316
  } else {
317
  throw new RuntimeException(
318
  'The gmp or bcmath extension must be installed to read this database.'
@@ -323,7 +346,7 @@ class Decoder
323
  return $integer;
324
  }
325
 
326
- private function sizeFromCtrlByte($ctrlByte, $offset)
327
  {
328
  $size = $ctrlByte & 0x1f;
329
 
@@ -337,23 +360,22 @@ class Decoder
337
  if ($size === 29) {
338
  $size = 29 + \ord($bytes);
339
  } elseif ($size === 30) {
340
- list(, $adjust) = unpack('n', $bytes);
341
  $size = 285 + $adjust;
342
- } elseif ($size > 30) {
343
- list(, $adjust) = unpack('N', "\x00" . $bytes);
344
- $size = ($adjust & (0x0FFFFFFF >> (32 - (8 * $bytesToRead))))
345
- + 65821;
346
  }
347
 
348
  return [$size, $offset + $bytesToRead];
349
  }
350
 
351
- private function maybeSwitchByteOrder($bytes)
352
  {
353
  return $this->switchByteOrder ? strrev($bytes) : $bytes;
354
  }
355
 
356
- private function isPlatformLittleEndian()
357
  {
358
  $testint = 0x00FF;
359
  $packed = pack('S', $testint);
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Db\Reader;
6
 
7
  // @codingStandardsIgnoreLine
8
  use RuntimeException;
9
 
10
+ /*
11
  * @ignore
12
  *
13
  * We subtract 1 from the log to protect against precision loss.
14
  */
15
+ \define(__NAMESPACE__ . '\_MM_MAX_INT_BYTES', (int) ((log(\PHP_INT_MAX, 2) - 1) / 8));
16
 
17
  class Decoder
18
  {
19
+ /**
20
+ * @var resource
21
+ */
22
  private $fileStream;
23
+ /**
24
+ * @var int
25
+ */
26
  private $pointerBase;
27
+ /**
28
+ * @var float
29
+ */
30
  private $pointerBaseByteSize;
31
+ /**
32
+ * This is only used for unit testing.
33
+ *
34
+ * @var bool
35
+ */
36
  private $pointerTestHack;
37
+ /**
38
+ * @var bool
39
+ */
40
  private $switchByteOrder;
41
 
42
+ private const _EXTENDED = 0;
43
+ private const _POINTER = 1;
44
+ private const _UTF8_STRING = 2;
45
+ private const _DOUBLE = 3;
46
+ private const _BYTES = 4;
47
+ private const _UINT16 = 5;
48
+ private const _UINT32 = 6;
49
+ private const _MAP = 7;
50
+ private const _INT32 = 8;
51
+ private const _UINT64 = 9;
52
+ private const _UINT128 = 10;
53
+ private const _ARRAY = 11;
54
+ private const _CONTAINER = 12;
55
+ private const _END_MARKER = 13;
56
+ private const _BOOLEAN = 14;
57
+ private const _FLOAT = 15;
58
+
59
+ /**
60
+ * @param resource $fileStream
61
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  public function __construct(
63
  $fileStream,
64
+ int $pointerBase = 0,
65
+ bool $pointerTestHack = false
66
  ) {
67
  $this->fileStream = $fileStream;
68
  $this->pointerBase = $pointerBase;
73
  $this->switchByteOrder = $this->isPlatformLittleEndian();
74
  }
75
 
76
+ public function decode(int $offset): array
77
  {
78
+ $ctrlByte = \ord(Util::read($this->fileStream, $offset, 1));
 
 
 
79
  ++$offset;
80
 
81
  $type = $ctrlByte >> 5;
84
  // use the size to determine the length of the pointer and then follow
85
  // it.
86
  if ($type === self::_POINTER) {
87
+ [$pointer, $offset] = $this->decodePointer($ctrlByte, $offset);
88
 
89
  // for unit testing
90
  if ($this->pointerTestHack) {
91
  return [$pointer];
92
  }
93
 
94
+ [$result] = $this->decode($pointer);
95
 
96
  return [$result, $offset];
97
  }
98
 
99
  if ($type === self::_EXTENDED) {
100
+ $nextByte = \ord(Util::read($this->fileStream, $offset, 1));
 
 
 
101
 
102
  $type = $nextByte + 7;
103
 
113
  ++$offset;
114
  }
115
 
116
+ [$size, $offset] = $this->sizeFromCtrlByte($ctrlByte, $offset);
117
 
118
  return $this->decodeByType($type, $offset, $size);
119
  }
120
 
121
+ private function decodeByType(int $type, int $offset, int $size): array
122
  {
123
  switch ($type) {
124
  case self::_MAP:
125
  return $this->decodeMap($size, $offset);
126
+
127
  case self::_ARRAY:
128
  return $this->decodeArray($size, $offset);
129
+
130
  case self::_BOOLEAN:
131
  return [$this->decodeBoolean($size), $offset];
132
  }
133
 
134
  $newOffset = $offset + $size;
135
  $bytes = Util::read($this->fileStream, $offset, $size);
136
+
137
  switch ($type) {
138
  case self::_BYTES:
139
  case self::_UTF8_STRING:
140
  return [$bytes, $newOffset];
141
+
142
  case self::_DOUBLE:
143
  $this->verifySize(8, $size);
144
 
145
  return [$this->decodeDouble($bytes), $newOffset];
146
+
147
  case self::_FLOAT:
148
  $this->verifySize(4, $size);
149
 
150
  return [$this->decodeFloat($bytes), $newOffset];
151
+
152
  case self::_INT32:
153
  return [$this->decodeInt32($bytes, $size), $newOffset];
154
+
155
  case self::_UINT16:
156
  case self::_UINT32:
157
  case self::_UINT64:
158
  case self::_UINT128:
159
  return [$this->decodeUint($bytes, $size), $newOffset];
160
+
161
  default:
162
  throw new InvalidDatabaseException(
163
  'Unknown or unexpected type: ' . $type
165
  }
166
  }
167
 
168
+ private function verifySize(int $expected, int $actual): void
169
  {
170
  if ($expected !== $actual) {
171
  throw new InvalidDatabaseException(
174
  }
175
  }
176
 
177
+ private function decodeArray(int $size, int $offset): array
178
  {
179
  $array = [];
180
 
181
  for ($i = 0; $i < $size; ++$i) {
182
+ [$value, $offset] = $this->decode($offset);
183
+ $array[] = $value;
184
  }
185
 
186
  return [$array, $offset];
187
  }
188
 
189
+ private function decodeBoolean(int $size): bool
190
  {
191
+ return $size !== 0;
192
  }
193
 
194
+ private function decodeDouble(string $bytes): float
195
  {
196
  // This assumes IEEE 754 doubles, but most (all?) modern platforms
197
  // use them.
198
+ [, $double] = unpack('E', $bytes);
 
 
 
 
199
 
200
  return $double;
201
  }
202
 
203
+ private function decodeFloat(string $bytes): float
204
  {
205
  // This assumes IEEE 754 floats, but most (all?) modern platforms
206
  // use them.
207
+ [, $float] = unpack('G', $bytes);
 
 
 
 
208
 
209
  return $float;
210
  }
211
 
212
+ private function decodeInt32(string $bytes, int $size): int
213
  {
214
  switch ($size) {
215
  case 0:
216
  return 0;
217
+
218
  case 1:
219
  case 2:
220
  case 3:
221
+ $bytes = str_pad($bytes, 4, "\x00", \STR_PAD_LEFT);
222
+
223
  break;
224
+
225
  case 4:
226
  break;
227
+
228
  default:
229
  throw new InvalidDatabaseException(
230
  "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
231
  );
232
  }
233
 
234
+ [, $int] = unpack('l', $this->maybeSwitchByteOrder($bytes));
235
 
236
  return $int;
237
  }
238
 
239
+ private function decodeMap(int $size, int $offset): array
240
  {
241
  $map = [];
242
 
243
  for ($i = 0; $i < $size; ++$i) {
244
+ [$key, $offset] = $this->decode($offset);
245
+ [$value, $offset] = $this->decode($offset);
246
  $map[$key] = $value;
247
  }
248
 
249
  return [$map, $offset];
250
  }
251
 
252
+ private function decodePointer(int $ctrlByte, int $offset): array
253
  {
254
  $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
255
 
258
 
259
  switch ($pointerSize) {
260
  case 1:
261
+ $packed = \chr($ctrlByte & 0x7) . $buffer;
262
+ [, $pointer] = unpack('n', $packed);
263
  $pointer += $this->pointerBase;
264
+
265
  break;
266
+
267
  case 2:
268
+ $packed = "\x00" . \chr($ctrlByte & 0x7) . $buffer;
269
+ [, $pointer] = unpack('N', $packed);
270
  $pointer += $this->pointerBase + 2048;
271
+
272
  break;
273
+
274
  case 3:
275
+ $packed = \chr($ctrlByte & 0x7) . $buffer;
276
 
277
  // It is safe to use 'N' here, even on 32 bit machines as the
278
  // first bit is 0.
279
+ [, $pointer] = unpack('N', $packed);
280
  $pointer += $this->pointerBase + 526336;
281
+
282
  break;
283
+
284
  case 4:
285
  // We cannot use unpack here as we might overflow on 32 bit
286
  // machines
293
  } elseif (\extension_loaded('gmp')) {
294
  $pointer = gmp_strval(gmp_add($pointerOffset, $this->pointerBase));
295
  } elseif (\extension_loaded('bcmath')) {
296
+ $pointer = bcadd($pointerOffset, (string) $this->pointerBase);
297
  } else {
298
  throw new RuntimeException(
299
  'The gmp or bcmath extension must be installed to read this database.'
300
  );
301
  }
302
+
303
+ break;
304
+
305
+ default:
306
+ throw new InvalidDatabaseException(
307
+ 'Unexpected pointer size ' . $pointerSize
308
+ );
309
  }
310
 
311
  return [$pointer, $offset];
312
  }
313
 
314
+ // @phpstan-ignore-next-line
315
+ private function decodeUint(string $bytes, int $byteLength)
316
  {
317
  if ($byteLength === 0) {
318
  return 0;
320
 
321
  $integer = 0;
322
 
323
+ // PHP integers are signed. _MM_MAX_INT_BYTES is the number of
324
+ // complete bytes that can be converted to an integer. However,
325
+ // we can convert another byte if the leading bit is zero.
326
+ $useRealInts = $byteLength <= _MM_MAX_INT_BYTES
327
+ || ($byteLength === _MM_MAX_INT_BYTES + 1 && (\ord($bytes[0]) & 0x80) === 0);
328
+
329
  for ($i = 0; $i < $byteLength; ++$i) {
330
  $part = \ord($bytes[$i]);
331
 
332
  // We only use gmp or bcmath if the final value is too big
333
+ if ($useRealInts) {
334
  $integer = ($integer << 8) + $part;
335
  } elseif (\extension_loaded('gmp')) {
336
+ $integer = gmp_strval(gmp_add(gmp_mul((string) $integer, '256'), $part));
337
  } elseif (\extension_loaded('bcmath')) {
338
+ $integer = bcadd(bcmul((string) $integer, '256'), (string) $part);
339
  } else {
340
  throw new RuntimeException(
341
  'The gmp or bcmath extension must be installed to read this database.'
346
  return $integer;
347
  }
348
 
349
+ private function sizeFromCtrlByte(int $ctrlByte, int $offset): array
350
  {
351
  $size = $ctrlByte & 0x1f;
352
 
360
  if ($size === 29) {
361
  $size = 29 + \ord($bytes);
362
  } elseif ($size === 30) {
363
+ [, $adjust] = unpack('n', $bytes);
364
  $size = 285 + $adjust;
365
+ } else {
366
+ [, $adjust] = unpack('N', "\x00" . $bytes);
367
+ $size = $adjust + 65821;
 
368
  }
369
 
370
  return [$size, $offset + $bytesToRead];
371
  }
372
 
373
+ private function maybeSwitchByteOrder(string $bytes): string
374
  {
375
  return $this->switchByteOrder ? strrev($bytes) : $bytes;
376
  }
377
 
378
+ private function isPlatformLittleEndian(): bool
379
  {
380
  $testint = 0x00FF;
381
  $packed = pack('S', $testint);
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  use Exception;
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Db\Reader;
6
 
7
  use Exception;
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php CHANGED
@@ -1,71 +1,100 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
 
 
5
  /**
6
  * This class provides the metadata for the MaxMind DB file.
7
- *
8
- * @property int $nodeCount This is an unsigned 32-bit
9
- * integer indicating the number of
10
- * nodes in the search tree.
11
- * @property int $recordSize This is an unsigned 16-bit
12
- * integer. It indicates the number
13
- * of bits in a record in the search
14
- * tree. Note that each node
15
- * consists of two records.
16
- * @property int $ipVersion This is an unsigned 16-bit
17
- * integer which is always 4 or 6.
18
- * It indicates whether the database
19
- * contains IPv4 or IPv6 address
20
- * data.
21
- * @property string $databaseType This is a string that indicates
22
- * the structure of each data record
23
- * associated with an IP address.
24
- * The actual definition of these
25
- * structures is left up to the
26
- * database creator.
27
- * @property array $languages An array of strings, each of
28
- * which is a language code. A given
29
- * record may contain data items
30
- * that have been localized to some
31
- * or all of these languages. This
32
- * may be undefined.
33
- * @property int $binaryFormatMajorVersion This is an unsigned 16-bit
34
- * integer indicating the major
35
- * version number for the database's
36
- * binary format.
37
- * @property int $binaryFormatMinorVersion This is an unsigned 16-bit
38
- * integer indicating the minor
39
- * version number for the database's
40
- * binary format.
41
- * @property int $buildEpoch This is an unsigned 64-bit
42
- * integer that contains the
43
- * database build timestamp as a
44
- * Unix epoch value.
45
- * @property array $description This key will always point to a
46
- * map (associative array). The keys
47
- * of that map will be language
48
- * codes, and the values will be a
49
- * description in that language as a
50
- * UTF-8 string. May be undefined
51
- * for some databases.
52
  */
53
  class Metadata
54
  {
55
- private $binaryFormatMajorVersion;
56
- private $binaryFormatMinorVersion;
57
- private $buildEpoch;
58
- private $databaseType;
59
- private $description;
60
- private $ipVersion;
61
- private $languages;
62
- private $nodeByteSize;
63
- private $nodeCount;
64
- private $recordSize;
65
- private $searchTreeSize;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- public function __construct($metadata)
68
  {
 
 
 
 
 
 
69
  $this->binaryFormatMajorVersion =
70
  $metadata['binary_format_major_version'];
71
  $this->binaryFormatMinorVersion =
@@ -80,9 +109,4 @@ class Metadata
80
  $this->nodeByteSize = $this->recordSize / 4;
81
  $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
82
  }
83
-
84
- public function __get($var)
85
- {
86
- return $this->$var;
87
- }
88
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Db\Reader;
6
 
7
+ use ArgumentCountError;
8
+
9
  /**
10
  * This class provides the metadata for the MaxMind DB file.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  */
12
  class Metadata
13
  {
14
+ /**
15
+ * This is an unsigned 16-bit integer indicating the major version number
16
+ * for the database's binary format.
17
+ *
18
+ * @var int
19
+ */
20
+ public $binaryFormatMajorVersion;
21
+ /**
22
+ * This is an unsigned 16-bit integer indicating the minor version number
23
+ * for the database's binary format.
24
+ *
25
+ * @var int
26
+ */
27
+ public $binaryFormatMinorVersion;
28
+ /**
29
+ * This is an unsigned 64-bit integer that contains the database build
30
+ * timestamp as a Unix epoch value.
31
+ *
32
+ * @var int
33
+ */
34
+ public $buildEpoch;
35
+ /**
36
+ * This is a string that indicates the structure of each data record
37
+ * associated with an IP address. The actual definition of these
38
+ * structures is left up to the database creator.
39
+ *
40
+ * @var string
41
+ */
42
+ public $databaseType;
43
+ /**
44
+ * This key will always point to a map (associative array). The keys of
45
+ * that map will be language codes, and the values will be a description
46
+ * in that language as a UTF-8 string. May be undefined for some
47
+ * databases.
48
+ *
49
+ * @var array
50
+ */
51
+ public $description;
52
+ /**
53
+ * This is an unsigned 16-bit integer which is always 4 or 6. It indicates
54
+ * whether the database contains IPv4 or IPv6 address data.
55
+ *
56
+ * @var int
57
+ */
58
+ public $ipVersion;
59
+ /**
60
+ * An array of strings, each of which is a language code. A given record
61
+ * may contain data items that have been localized to some or all of
62
+ * these languages. This may be undefined.
63
+ *
64
+ * @var array
65
+ */
66
+ public $languages;
67
+ /**
68
+ * @var int
69
+ */
70
+ public $nodeByteSize;
71
+ /**
72
+ * This is an unsigned 32-bit integer indicating the number of nodes in
73
+ * the search tree.
74
+ *
75
+ * @var int
76
+ */
77
+ public $nodeCount;
78
+ /**
79
+ * This is an unsigned 16-bit integer. It indicates the number of bits in a
80
+ * record in the search tree. Note that each node consists of two records.
81
+ *
82
+ * @var int
83
+ */
84
+ public $recordSize;
85
+ /**
86
+ * @var int
87
+ */
88
+ public $searchTreeSize;
89
 
90
+ public function __construct(array $metadata)
91
  {
92
+ if (\func_num_args() !== 1) {
93
+ throw new ArgumentCountError(
94
+ sprintf('%s() expects exactly 1 parameter, %d given', __METHOD__, \func_num_args())
95
+ );
96
+ }
97
+
98
  $this->binaryFormatMajorVersion =
99
  $metadata['binary_format_major_version'];
100
  $this->binaryFormatMinorVersion =
109
  $this->nodeByteSize = $this->recordSize / 4;
110
  $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
111
  }
 
 
 
 
 
112
  }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php CHANGED
@@ -1,10 +1,15 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Db\Reader;
4
 
5
  class Util
6
  {
7
- public static function read($stream, $offset, $numberOfBytes)
 
 
 
8
  {
9
  if ($numberOfBytes === 0) {
10
  return '';
@@ -15,10 +20,11 @@ class Util
15
  // We check that the number of bytes read is equal to the number
16
  // asked for. We use ftell as getting the length of $value is
17
  // much slower.
18
- if (ftell($stream) - $offset === $numberOfBytes) {
19
  return $value;
20
  }
21
  }
 
22
  throw new InvalidDatabaseException(
23
  'The MaxMind DB file contains bad data'
24
  );
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Db\Reader;
6
 
7
  class Util
8
  {
9
+ /**
10
+ * @param resource $stream
11
+ */
12
+ public static function read($stream, int $offset, int $numberOfBytes): string
13
  {
14
  if ($numberOfBytes === 0) {
15
  return '';
20
  // We check that the number of bytes read is equal to the number
21
  // asked for. We use ftell as getting the length of $value is
22
  // much slower.
23
+ if ($value !== false && ftell($stream) - $offset === $numberOfBytes) {
24
  return $value;
25
  }
26
  }
27
+
28
  throw new InvalidDatabaseException(
29
  'The MaxMind DB file contains bad data'
30
  );
vendor/maxmind/web-service-common/CHANGELOG.md CHANGED
@@ -1,6 +1,33 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  0.5.0 (2018-02-12)
5
  ------------------
6
 
1
  CHANGELOG
2
  =========
3
 
4
+ 0.8.1 (2020-11-02)
5
+ ------------------
6
+
7
+ * We now correctly handle responses without a `Content-Type` header. In 0.8.0,
8
+ such responses could lead to a type error. In particular, this affected the
9
+ minFraud Report Transaction endpoint, which returns a response with no
10
+ content. Reported by Dmitry Malashko. GitHub #99 on
11
+ `maxmind/minfraud-api-php`.
12
+
13
+ 0.8.0 (2020-10-01)
14
+ ------------------
15
+
16
+ * PHP 7.2 or greater is now required.
17
+ * Added additional type hints.
18
+
19
+ 0.7.0 (2020-05-06)
20
+ ------------------
21
+
22
+ * Responses with a 204 status code are accepted as successes.
23
+
24
+ 0.6.0 (2019-12-12)
25
+ ------------------
26
+
27
+ * Curl handles are now reused across requests. Pull request by Willem
28
+ Stuursma-Ruwen. GitHub #24.
29
+ * PHP 5.6 is now required.
30
+
31
  0.5.0 (2018-02-12)
32
  ------------------
33
 
vendor/maxmind/web-service-common/README.md CHANGED
@@ -5,8 +5,7 @@ shared code between MaxMind's various web service client APIs.
5
 
6
  ## Requirements ##
7
 
8
- The library requires PHP 5.4 or greater. This library works and is tested
9
- with HHVM.
10
 
11
  There are several other dependencies as defined in the `composer.json` file.
12
 
@@ -21,6 +20,6 @@ This API uses [Semantic Versioning](http://semver.org/).
21
 
22
  ## Copyright and License ##
23
 
24
- This software is Copyright (c) 2015-2018 by MaxMind, Inc.
25
 
26
  This is free software, licensed under the Apache License, Version 2.0.
5
 
6
  ## Requirements ##
7
 
8
+ The library requires PHP 7.2 or greater.
 
9
 
10
  There are several other dependencies as defined in the `composer.json` file.
11
 
20
 
21
  ## Copyright and License ##
22
 
23
+ This software is Copyright (c) 2015-2020 by MaxMind, Inc.
24
 
25
  This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind/web-service-common/composer.json CHANGED
@@ -12,14 +12,14 @@
12
  }
13
  ],
14
  "require": {
15
- "php": ">=5.4",
16
  "composer/ca-bundle": "^1.0.3",
17
  "ext-curl": "*",
18
  "ext-json": "*"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
- "phpunit/phpunit": "4.*",
23
  "squizlabs/php_codesniffer": "3.*"
24
  },
25
  "autoload": {
12
  }
13
  ],
14
  "require": {
15
+ "php": ">=7.2",
16
  "composer/ca-bundle": "^1.0.3",
17
  "ext-curl": "*",
18
  "ext-json": "*"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
+ "phpunit/phpunit": "^8.0 || ^9.0",
23
  "squizlabs/php_codesniffer": "3.*"
24
  },
25
  "autoload": {
vendor/maxmind/web-service-common/dev-bin/release.sh CHANGED
@@ -20,7 +20,7 @@ fi
20
 
21
  version="${BASH_REMATCH[1]}"
22
  date="${BASH_REMATCH[2]}"
23
- notes="$(echo "${BASH_REMATCH[3]}" | sed -n -e '/^[0-9]\+\.[0-9]\+\.[0-9]\+/,$!p')"
24
 
25
  if [[ "$date" != $(date +"%Y-%m-%d") ]]; then
26
  echo "$date is not today!"
20
 
21
  version="${BASH_REMATCH[1]}"
22
  date="${BASH_REMATCH[2]}"
23
+ notes="$(echo "${BASH_REMATCH[3]}" | sed -n -E '/^[0-9]+\.[0-9]+\.[0-9]+/,$!p')"
24
 
25
  if [[ "$date" != $(date +"%Y-%m-%d") ]]; then
26
  echo "$date is not today!"
vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
vendor/maxmind/web-service-common/src/Exception/HttpException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
@@ -19,21 +21,21 @@ class HttpException extends WebServiceException
19
  * @param \Exception $previous the previous exception, if any
20
  */
21
  public function __construct(
22
- $message,
23
- $httpStatus,
24
- $uri,
25
  \Exception $previous = null
26
  ) {
27
  $this->uri = $uri;
28
  parent::__construct($message, $httpStatus, $previous);
29
  }
30
 
31
- public function getUri()
32
  {
33
  return $this->uri;
34
  }
35
 
36
- public function getStatusCode()
37
  {
38
  return $this->getCode();
39
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
21
  * @param \Exception $previous the previous exception, if any
22
  */
23
  public function __construct(
24
+ string $message,
25
+ int $httpStatus,
26
+ string $uri,
27
  \Exception $previous = null
28
  ) {
29
  $this->uri = $uri;
30
  parent::__construct($message, $httpStatus, $previous);
31
  }
32
 
33
+ public function getUri(): string
34
  {
35
  return $this->uri;
36
  }
37
 
38
+ public function getStatusCode(): int
39
  {
40
  return $this->getCode();
41
  }
vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
@@ -14,23 +16,23 @@ class InvalidRequestException extends HttpException
14
 
15
  /**
16
  * @param string $message the exception message
17
- * @param int $error the error code returned by the MaxMind web service
18
  * @param int $httpStatus the HTTP status code of the response
19
  * @param string $uri the URI queries
20
  * @param \Exception $previous the previous exception, if any
21
  */
22
  public function __construct(
23
- $message,
24
- $error,
25
- $httpStatus,
26
- $uri,
27
  \Exception $previous = null
28
  ) {
29
  $this->error = $error;
30
  parent::__construct($message, $httpStatus, $uri, $previous);
31
  }
32
 
33
- public function getErrorCode()
34
  {
35
  return $this->error;
36
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
16
 
17
  /**
18
  * @param string $message the exception message
19
+ * @param string $error the error code returned by the MaxMind web service
20
  * @param int $httpStatus the HTTP status code of the response
21
  * @param string $uri the URI queries
22
  * @param \Exception $previous the previous exception, if any
23
  */
24
  public function __construct(
25
+ string $message,
26
+ string $error,
27
+ int $httpStatus,
28
+ string $uri,
29
  \Exception $previous = null
30
  ) {
31
  $this->error = $error;
32
  parent::__construct($message, $httpStatus, $uri, $previous);
33
  }
34
 
35
+ public function getErrorCode(): string
36
  {
37
  return $this->error;
38
  }
vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  class IpAddressNotFoundException extends InvalidRequestException
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  class IpAddressNotFoundException extends InvalidRequestException
vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
vendor/maxmind/web-service-common/src/Exception/WebServiceException.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\Exception;
4
 
5
  /**
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\Exception;
6
 
7
  /**
vendor/maxmind/web-service-common/src/WebService/Client.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService;
4
 
5
  use Composer\CaBundle\CaBundle;
@@ -47,9 +49,9 @@ class Client
47
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
48
  */
49
  public function __construct(
50
- $accountId,
51
- $licenseKey,
52
- $options = []
53
  ) {
54
  $this->accountId = $accountId;
55
  $this->licenseKey = $licenseKey;
@@ -96,12 +98,12 @@ class Client
96
  * @throws WebServiceException when some other error occurs. This also
97
  * serves as the base class for the above exceptions.
98
  *
99
- * @return array The decoded content of a successful response
100
  */
101
- public function post($service, $path, $input)
102
  {
103
- $body = json_encode($input);
104
- if ($body === false) {
105
  throw new InvalidInputException(
106
  'Error encoding input as JSON: '
107
  . $this->jsonErrorDescription()
@@ -113,33 +115,33 @@ class Client
113
  ['Content-Type: application/json']
114
  );
115
 
116
- list($statusCode, $contentType, $body) = $request->post($body);
117
 
118
  return $this->handleResponse(
119
  $statusCode,
120
  $contentType,
121
- $body,
122
  $service,
123
  $path
124
  );
125
  }
126
 
127
- public function get($service, $path)
128
  {
129
  $request = $this->createRequest($path);
130
 
131
- list($statusCode, $contentType, $body) = $request->get();
132
 
133
  return $this->handleResponse(
134
  $statusCode,
135
  $contentType,
136
- $body,
137
  $service,
138
  $path
139
  );
140
  }
141
 
142
- private function userAgent()
143
  {
144
  $curlVersion = curl_version();
145
 
@@ -147,7 +149,7 @@ class Client
147
  ' curl/' . $curlVersion['version'];
148
  }
149
 
150
- private function createRequest($path, $headers = [])
151
  {
152
  array_push(
153
  $headers,
@@ -170,11 +172,11 @@ class Client
170
  }
171
 
172
  /**
173
- * @param int $statusCode the HTTP status code of the response
174
- * @param string $contentType the Content-Type of the response
175
- * @param string $body the response body
176
- * @param string $service the name of the service
177
- * @param string $path the path used in the request
178
  *
179
  * @throws AuthenticationException when there is an issue authenticating the
180
  * request
@@ -185,30 +187,30 @@ class Client
185
  * @throws WebServiceException when some other error occurs. This also
186
  * serves as the base class for the above exceptions
187
  *
188
- * @return array The decoded content of a successful response
189
  */
190
  private function handleResponse(
191
- $statusCode,
192
- $contentType,
193
- $body,
194
- $service,
195
- $path
196
- ) {
197
  if ($statusCode >= 400 && $statusCode <= 499) {
198
- $this->handle4xx($statusCode, $contentType, $body, $service, $path);
199
  } elseif ($statusCode >= 500) {
200
  $this->handle5xx($statusCode, $service, $path);
201
- } elseif ($statusCode !== 200) {
202
  $this->handleUnexpectedStatus($statusCode, $service, $path);
203
  }
204
 
205
- return $this->handleSuccess($body, $service);
206
  }
207
 
208
  /**
209
  * @return string describing the JSON error
210
  */
211
- private function jsonErrorDescription()
212
  {
213
  $errno = json_last_error();
214
  switch ($errno) {
@@ -232,17 +234,17 @@ class Client
232
  *
233
  * @return string the constructed URL
234
  */
235
- private function urlFor($path)
236
  {
237
  return 'https://' . $this->host . $path;
238
  }
239
 
240
  /**
241
- * @param int $statusCode the HTTP status code
242
- * @param string $contentType the response content-type
243
- * @param string $body the response body
244
- * @param string $service the service name
245
- * @param string $path the path used in the request
246
  *
247
  * @throws AuthenticationException
248
  * @throws HttpException
@@ -250,20 +252,20 @@ class Client
250
  * @throws InvalidRequestException
251
  */
252
  private function handle4xx(
253
- $statusCode,
254
- $contentType,
255
- $body,
256
- $service,
257
- $path
258
- ) {
259
- if (strlen($body) === 0) {
260
  throw new HttpException(
261
  "Received a $statusCode error for $service with no body",
262
  $statusCode,
263
  $this->urlFor($path)
264
  );
265
  }
266
- if (!strstr($contentType, 'json')) {
267
  throw new HttpException(
268
  "Received a $statusCode error for $service with " .
269
  'the following body: ' . $body,
@@ -311,11 +313,11 @@ class Client
311
  * @throws InsufficientFundsException
312
  */
313
  private function handleWebServiceError(
314
- $message,
315
- $code,
316
- $statusCode,
317
- $path
318
- ) {
319
  switch ($code) {
320
  case 'IP_ADDRESS_NOT_FOUND':
321
  case 'IP_ADDRESS_RESERVED':
@@ -369,7 +371,7 @@ class Client
369
  *
370
  * @throws HttpException
371
  */
372
- private function handle5xx($statusCode, $service, $path)
373
  {
374
  throw new HttpException(
375
  "Received a server error ($statusCode) for $service",
@@ -385,7 +387,7 @@ class Client
385
  *
386
  * @throws HttpException
387
  */
388
- private function handleUnexpectedStatus($statusCode, $service, $path)
389
  {
390
  throw new HttpException(
391
  'Received an unexpected HTTP status ' .
@@ -396,17 +398,33 @@ class Client
396
  }
397
 
398
  /**
399
- * @param string $body the successful request body
400
- * @param string $service the service name
 
401
  *
402
- * @throws WebServiceException if the request body cannot be decoded as
403
- * JSON
 
 
404
  *
405
- * @return array the decoded request body
406
  */
407
- private function handleSuccess($body, $service)
408
  {
409
- if (strlen($body) === 0) {
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  throw new WebServiceException(
411
  "Received a 200 response for $service but did not " .
412
  'receive a HTTP body.'
@@ -432,7 +450,7 @@ class Client
432
  // On OS X, when the SSL version is "SecureTransport", the system's
433
  // keychain will be used.
434
  if ($curlVersion['ssl_version'] === 'SecureTransport') {
435
- return;
436
  }
437
  $cert = CaBundle::getSystemCaRootBundlePath();
438
 
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\WebService;
6
 
7
  use Composer\CaBundle\CaBundle;
49
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
50
  */
51
  public function __construct(
52
+ int $accountId,
53
+ string $licenseKey,
54
+ array $options = []
55
  ) {
56
  $this->accountId = $accountId;
57
  $this->licenseKey = $licenseKey;
98
  * @throws WebServiceException when some other error occurs. This also
99
  * serves as the base class for the above exceptions.
100
  *
101
+ * @return array|null The decoded content of a successful response
102
  */
103
+ public function post(string $service, string $path, array $input): ?array
104
  {
105
+ $requestBody = json_encode($input);
106
+ if ($requestBody === false) {
107
  throw new InvalidInputException(
108
  'Error encoding input as JSON: '
109
  . $this->jsonErrorDescription()
115
  ['Content-Type: application/json']
116
  );
117
 
118
+ list($statusCode, $contentType, $responseBody) = $request->post($requestBody);
119
 
120
  return $this->handleResponse(
121
  $statusCode,
122
  $contentType,
123
+ $responseBody,
124
  $service,
125
  $path
126
  );
127
  }
128
 
129
+ public function get(string $service, string $path): ?array
130
  {
131
  $request = $this->createRequest($path);
132
 
133
+ list($statusCode, $contentType, $responseBody) = $request->get();
134
 
135
  return $this->handleResponse(
136
  $statusCode,
137
  $contentType,
138
+ $responseBody,
139
  $service,
140
  $path
141
  );
142
  }
143
 
144
+ private function userAgent(): string
145
  {
146
  $curlVersion = curl_version();
147
 
149
  ' curl/' . $curlVersion['version'];
150
  }
151
 
152
+ private function createRequest(string $path, array $headers = []): \MaxMind\WebService\Http\Request
153
  {
154
  array_push(
155
  $headers,
172
  }
173
 
174
  /**
175
+ * @param int $statusCode the HTTP status code of the response
176
+ * @param string|null $contentType the Content-Type of the response
177
+ * @param string|null $responseBody the response body
178
+ * @param string $service the name of the service
179
+ * @param string $path the path used in the request
180
  *
181
  * @throws AuthenticationException when there is an issue authenticating the
182
  * request
187
  * @throws WebServiceException when some other error occurs. This also
188
  * serves as the base class for the above exceptions
189
  *
190
+ * @return array|null The decoded content of a successful response
191
  */
192
  private function handleResponse(
193
+ int $statusCode,
194
+ ?string $contentType,
195
+ ?string $responseBody,
196
+ string $service,
197
+ string $path
198
+ ): ?array {
199
  if ($statusCode >= 400 && $statusCode <= 499) {
200
+ $this->handle4xx($statusCode, $contentType, $responseBody, $service, $path);
201
  } elseif ($statusCode >= 500) {
202
  $this->handle5xx($statusCode, $service, $path);
203
+ } elseif ($statusCode !== 200 && $statusCode !== 204) {
204
  $this->handleUnexpectedStatus($statusCode, $service, $path);
205
  }
206
 
207
+ return $this->handleSuccess($statusCode, $responseBody, $service);
208
  }
209
 
210
  /**
211
  * @return string describing the JSON error
212
  */
213
+ private function jsonErrorDescription(): string
214
  {
215
  $errno = json_last_error();
216
  switch ($errno) {
234
  *
235
  * @return string the constructed URL
236
  */
237
+ private function urlFor(string $path): string
238
  {
239
  return 'https://' . $this->host . $path;
240
  }
241
 
242
  /**
243
+ * @param int $statusCode the HTTP status code
244
+ * @param string|null $contentType the response content-type
245
+ * @param string|null $body the response body
246
+ * @param string $service the service name
247
+ * @param string $path the path used in the request
248
  *
249
  * @throws AuthenticationException
250
  * @throws HttpException
252
  * @throws InvalidRequestException
253
  */
254
  private function handle4xx(
255
+ int $statusCode,
256
+ ?string $contentType,
257
+ ?string $body,
258
+ string $service,
259
+ string $path
260
+ ): void {
261
+ if ($body === null || $body === '') {
262
  throw new HttpException(
263
  "Received a $statusCode error for $service with no body",
264
  $statusCode,
265
  $this->urlFor($path)
266
  );
267
  }
268
+ if ($contentType === null || !strstr($contentType, 'json')) {
269
  throw new HttpException(
270
  "Received a $statusCode error for $service with " .
271
  'the following body: ' . $body,
313
  * @throws InsufficientFundsException
314
  */
315
  private function handleWebServiceError(
316
+ string $message,
317
+ string $code,
318
+ int $statusCode,
319
+ string $path
320
+ ): void {
321
  switch ($code) {
322
  case 'IP_ADDRESS_NOT_FOUND':
323
  case 'IP_ADDRESS_RESERVED':
371
  *
372
  * @throws HttpException
373
  */
374
+ private function handle5xx(int $statusCode, string $service, string $path): void
375
  {
376
  throw new HttpException(
377
  "Received a server error ($statusCode) for $service",
387
  *
388
  * @throws HttpException
389
  */
390
+ private function handleUnexpectedStatus(int $statusCode, string $service, string $path): void
391
  {
392
  throw new HttpException(
393
  'Received an unexpected HTTP status ' .
398
  }
399
 
400
  /**
401
+ * @param int $statusCode the HTTP status code
402
+ * @param string|null $body the successful request body
403
+ * @param string $service the service name
404
  *
405
+ * @throws WebServiceException if a response body is included but not
406
+ * expected, or is not expected but not
407
+ * included, or is expected and included
408
+ * but cannot be decoded as JSON
409
  *
410
+ * @return array|null the decoded request body
411
  */
412
+ private function handleSuccess(int $statusCode, ?string $body, string $service): ?array
413
  {
414
+ // A 204 should have no response body
415
+ if ($statusCode === 204) {
416
+ if ($body !== null && $body !== '') {
417
+ throw new WebServiceException(
418
+ "Received a 204 response for $service along with an " .
419
+ "unexpected HTTP body: $body"
420
+ );
421
+ }
422
+
423
+ return null;
424
+ }
425
+
426
+ // A 200 should have a valid JSON body
427
+ if ($body === null || $body === '') {
428
  throw new WebServiceException(
429
  "Received a 200 response for $service but did not " .
430
  'receive a HTTP body.'
450
  // On OS X, when the SSL version is "SecureTransport", the system's
451
  // keychain will be used.
452
  if ($curlVersion['ssl_version'] === 'SecureTransport') {
453
+ return null;
454
  }
455
  $cert = CaBundle::getSystemCaRootBundlePath();
456
 
vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  use MaxMind\Exception\HttpException;
@@ -11,25 +13,32 @@ use MaxMind\Exception\HttpException;
11
  */
12
  class CurlRequest implements Request
13
  {
 
 
 
 
 
 
 
 
14
  private $url;
15
- private $options;
16
 
17
  /**
18
- * @param $url
19
- * @param $options
20
  */
21
- public function __construct($url, $options)
 
 
22
  {
23
  $this->url = $url;
24
  $this->options = $options;
 
25
  }
26
 
27
  /**
28
- * @param $body
29
- *
30
- * @return array
31
  */
32
- public function post($body)
33
  {
34
  $curl = $this->createCurl();
35
 
@@ -39,7 +48,7 @@ class CurlRequest implements Request
39
  return $this->execute($curl);
40
  }
41
 
42
- public function get()
43
  {
44
  $curl = $this->createCurl();
45
 
@@ -53,11 +62,16 @@ class CurlRequest implements Request
53
  */
54
  private function createCurl()
55
  {
56
- $curl = curl_init($this->url);
 
 
 
57
 
58
  if (!empty($this->options['caBundle'])) {
59
  $opts[CURLOPT_CAINFO] = $this->options['caBundle'];
60
  }
 
 
61
  $opts[CURLOPT_SSL_VERIFYHOST] = 2;
62
  $opts[CURLOPT_FOLLOWLOCATION] = false;
63
  $opts[CURLOPT_SSL_VERIFYPEER] = true;
@@ -70,25 +84,30 @@ class CurlRequest implements Request
70
  // The defined()s are here as the *_MS opts are not available on older
71
  // cURL versions
72
  $connectTimeout = $this->options['connectTimeout'];
73
- if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
74
  $opts[CURLOPT_CONNECTTIMEOUT_MS] = ceil($connectTimeout * 1000);
75
  } else {
76
  $opts[CURLOPT_CONNECTTIMEOUT] = ceil($connectTimeout);
77
  }
78
 
79
  $timeout = $this->options['timeout'];
80
- if (defined('CURLOPT_TIMEOUT_MS')) {
81
  $opts[CURLOPT_TIMEOUT_MS] = ceil($timeout * 1000);
82
  } else {
83
  $opts[CURLOPT_TIMEOUT] = ceil($timeout);
84
  }
85
 
86
- curl_setopt_array($curl, $opts);
87
 
88
- return $curl;
89
  }
90
 
91
- private function execute($curl)
 
 
 
 
 
92
  {
93
  $body = curl_exec($curl);
94
  if ($errno = curl_errno($curl)) {
@@ -103,8 +122,15 @@ class CurlRequest implements Request
103
 
104
  $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
105
  $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
106
- curl_close($curl);
107
 
108
- return [$statusCode, $contentType, $body];
 
 
 
 
 
 
 
 
109
  }
110
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\WebService\Http;
6
 
7
  use MaxMind\Exception\HttpException;
13
  */
14
  class CurlRequest implements Request
15
  {
16
+ /**
17
+ * @var resource
18
+ */
19
+ private $ch;
20
+
21
+ /**
22
+ * @var string
23
+ */
24
  private $url;
 
25
 
26
  /**
27
+ * @var array
 
28
  */
29
+ private $options;
30
+
31
+ public function __construct(string $url, array $options)
32
  {
33
  $this->url = $url;
34
  $this->options = $options;
35
+ $this->ch = $options['curlHandle'];
36
  }
37
 
38
  /**
39
+ * @throws HttpException
 
 
40
  */
41
+ public function post(string $body): array
42
  {
43
  $curl = $this->createCurl();
44
 
48
  return $this->execute($curl);
49
  }
50
 
51
+ public function get(): array
52
  {
53
  $curl = $this->createCurl();
54
 
62
  */
63
  private function createCurl()
64
  {
65
+ curl_reset($this->ch);
66
+
67
+ $opts = [];
68
+ $opts[CURLOPT_URL] = $this->url;
69
 
70
  if (!empty($this->options['caBundle'])) {
71
  $opts[CURLOPT_CAINFO] = $this->options['caBundle'];
72
  }
73
+
74
+ $opts[CURLOPT_ENCODING] = '';
75
  $opts[CURLOPT_SSL_VERIFYHOST] = 2;
76
  $opts[CURLOPT_FOLLOWLOCATION] = false;
77
  $opts[CURLOPT_SSL_VERIFYPEER] = true;
84
  // The defined()s are here as the *_MS opts are not available on older
85
  // cURL versions
86
  $connectTimeout = $this->options['connectTimeout'];
87
+ if (\defined('CURLOPT_CONNECTTIMEOUT_MS')) {
88
  $opts[CURLOPT_CONNECTTIMEOUT_MS] = ceil($connectTimeout * 1000);
89
  } else {
90
  $opts[CURLOPT_CONNECTTIMEOUT] = ceil($connectTimeout);
91
  }
92
 
93
  $timeout = $this->options['timeout'];
94
+ if (\defined('CURLOPT_TIMEOUT_MS')) {
95
  $opts[CURLOPT_TIMEOUT_MS] = ceil($timeout * 1000);
96
  } else {
97
  $opts[CURLOPT_TIMEOUT] = ceil($timeout);
98
  }
99
 
100
+ curl_setopt_array($this->ch, $opts);
101
 
102
+ return $this->ch;
103
  }
104
 
105
+ /**
106
+ * @param resource $curl
107
+ *
108
+ * @throws HttpException
109
+ */
110
+ private function execute($curl): array
111
  {
112
  $body = curl_exec($curl);
113
  if ($errno = curl_errno($curl)) {
122
 
123
  $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
124
  $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
 
125
 
126
+ return [
127
+ $statusCode,
128
+ // The PHP docs say "Content-Type: of the requested document. NULL
129
+ // indicates server did not send valid Content-Type: header" for
130
+ // CURLINFO_CONTENT_TYPE. However, it will return FALSE if no header
131
+ // is set. To keep our types simple, we return null in this case.
132
+ ($contentType === false ? null : $contentType),
133
+ $body,
134
+ ];
135
  }
136
  }
vendor/maxmind/web-service-common/src/WebService/Http/Request.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  /**
@@ -9,21 +11,9 @@ namespace MaxMind\WebService\Http;
9
  */
10
  interface Request
11
  {
12
- /**
13
- * @param $url
14
- * @param $options
15
- */
16
- public function __construct($url, $options);
17
 
18
- /**
19
- * @param $body
20
- *
21
- * @return mixed
22
- */
23
- public function post($body);
24
 
25
- /**
26
- * @return mixed
27
- */
28
- public function get();
29
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\WebService\Http;
6
 
7
  /**
11
  */
12
  interface Request
13
  {
14
+ public function __construct(string $url, array $options);
 
 
 
 
15
 
16
+ public function post(string $body): array;
 
 
 
 
 
17
 
18
+ public function get(): array;
 
 
 
19
  }
vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  namespace MaxMind\WebService\Http;
4
 
5
  /**
@@ -9,18 +11,38 @@ namespace MaxMind\WebService\Http;
9
  */
10
  class RequestFactory
11
  {
12
- public function __construct()
 
 
 
 
 
 
 
 
 
13
  {
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
 
16
  /**
17
- * @param $url
18
- * @param $options
19
- *
20
- * @return CurlRequest
21
  */
22
- public function request($url, $options)
23
  {
 
 
24
  return new CurlRequest($url, $options);
25
  }
26
  }
1
  <?php
2
 
3
+ declare(strict_types=1);
4
+
5
  namespace MaxMind\WebService\Http;
6
 
7
  /**
11
  */
12
  class RequestFactory
13
  {
14
+ /**
15
+ * Keep the cURL resource here, so that if there are multiple API requests
16
+ * done the connection is kept alive, SSL resumption can be used
17
+ * etcetera.
18
+ *
19
+ * @var resource
20
+ */
21
+ private $ch;
22
+
23
+ public function __destruct()
24
  {
25
+ if (!empty($this->ch)) {
26
+ curl_close($this->ch);
27
+ }
28
+ }
29
+
30
+ private function getCurlHandle()
31
+ {
32
+ if (empty($this->ch)) {
33
+ $this->ch = curl_init();
34
+ }
35
+
36
+ return $this->ch;
37
  }
38
 
39
  /**
40
+ * @return Request
 
 
 
41
  */
42
+ public function request(string $url, array $options)
43
  {
44
+ $options['curlHandle'] = $this->getCurlHandle();
45
+
46
  return new CurlRequest($url, $options);
47
  }
48
  }
vendor/symfony/deprecation-contracts/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ vendor/
2
+ composer.lock
3
+ phpunit.xml
vendor/symfony/deprecation-contracts/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ CHANGELOG
2
+ =========
3
+
4
+ The changelog is maintained for all Symfony contracts at the following URL:
5
+ https://github.com/symfony/contracts/blob/master/CHANGELOG.md
vendor/symfony/deprecation-contracts/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2020 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/deprecation-contracts/README.md ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Deprecation Contracts
2
+ =============================
3
+
4
+ A generic function and convention to trigger deprecation notices.
5
+
6
+ This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices.
7
+
8
+ By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component,
9
+ the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments.
10
+
11
+ The function requires at least 3 arguments:
12
+ - the name of the Composer package that is triggering the deprecation
13
+ - the version of the package that introduced the deprecation
14
+ - the message of the deprecation
15
+ - more arguments can be provided: they will be inserted in the message using `printf()` formatting
16
+
17
+ Example:
18
+ ```php
19
+ trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin');
20
+ ```
21
+
22
+ This will generate the following message:
23
+ `Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.`
24
+
25
+ While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty
26
+ `function trigger_deprecation() {}` in your application.
vendor/symfony/deprecation-contracts/composer.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/deprecation-contracts",
3
+ "type": "library",
4
+ "description": "A generic function and convention to trigger deprecation notices",
5
+ "homepage": "https://symfony.com",
6
+ "license": "MIT",
7
+ "authors": [
8
+ {
9
+ "name": "Nicolas Grekas",
10
+ "email": "p@tchwork.com"
11
+ },
12
+ {
13
+ "name": "Symfony Community",
14
+ "homepage": "https://symfony.com/contributors"
15
+ }
16
+ ],
17
+ "require": {
18
+ "php": ">=7.1"
19
+ },
20
+ "autoload": {
21
+ "files": [
22
+ "function.php"
23
+ ]
24
+ },
25
+ "minimum-stability": "dev",
26
+ "extra": {
27
+ "branch-alias": {
28
+ "dev-master": "2.2-dev"
29
+ },
30
+ "thanks": {
31
+ "name": "symfony/contracts",
32
+ "url": "https://github.com/symfony/contracts"
33
+ }
34
+ }
35
+ }
vendor/symfony/deprecation-contracts/function.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ if (!function_exists('trigger_deprecation')) {
13
+ /**
14
+ * Triggers a silenced deprecation notice.
15
+ *
16
+ * @param string $package The name of the Composer package that is triggering the deprecation
17
+ * @param string $version The version of the package that introduced the deprecation
18
+ * @param string $message The message of the deprecation
19
+ * @param mixed ...$args Values to insert in the message using printf() formatting
20
+ *
21
+ * @author Nicolas Grekas <p@tchwork.com>
22
+ */
23
+ function trigger_deprecation(string $package, string $version, string $message, ...$args): void
24
+ {
25
+ @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
26
+ }
27
+ }
vendor/symfony/http-foundation/IpUtils.php CHANGED
@@ -30,12 +30,11 @@ class IpUtils
30
  /**
31
  * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.
32
  *
33
- * @param string $requestIp IP to check
34
- * @param string|array $ips List of IPs or subnets (can be a string if only a single one)
35
  *
36
  * @return bool Whether the IP is valid
37
  */
38
- public static function checkIp($requestIp, $ips)
39
  {
40
  if (!\is_array($ips)) {
41
  $ips = [$ips];
@@ -56,27 +55,26 @@ class IpUtils
56
  * Compares two IPv4 addresses.
57
  * In case a subnet is given, it checks if it contains the request IP.
58
  *
59
- * @param string $requestIp IPv4 address to check
60
- * @param string $ip IPv4 address or subnet in CIDR notation
61
  *
62
  * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet
63
  */
64
- public static function checkIp4($requestIp, $ip)
65
  {
66
  $cacheKey = $requestIp.'-'.$ip;
67
  if (isset(self::$checkedIps[$cacheKey])) {
68
  return self::$checkedIps[$cacheKey];
69
  }
70
 
71
- if (!filter_var($requestIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
72
  return self::$checkedIps[$cacheKey] = false;
73
  }
74
 
75
  if (false !== strpos($ip, '/')) {
76
- list($address, $netmask) = explode('/', $ip, 2);
77
 
78
  if ('0' === $netmask) {
79
- return self::$checkedIps[$cacheKey] = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
80
  }
81
 
82
  if ($netmask < 0 || $netmask > 32) {
@@ -102,14 +100,13 @@ class IpUtils
102
  *
103
  * @see https://github.com/dsp/v6tools
104
  *
105
- * @param string $requestIp IPv6 address to check
106
- * @param string $ip IPv6 address or subnet in CIDR notation
107
  *
108
  * @return bool Whether the IP is valid
109
  *
110
  * @throws \RuntimeException When IPV6 support is not enabled
111
  */
112
- public static function checkIp6($requestIp, $ip)
113
  {
114
  $cacheKey = $requestIp.'-'.$ip;
115
  if (isset(self::$checkedIps[$cacheKey])) {
@@ -121,7 +118,7 @@ class IpUtils
121
  }
122
 
123
  if (false !== strpos($ip, '/')) {
124
- list($address, $netmask) = explode('/', $ip, 2);
125
 
126
  if ('0' === $netmask) {
127
  return (bool) unpack('n*', @inet_pton($address));
30
  /**
31
  * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.
32
  *
33
+ * @param string|array $ips List of IPs or subnets (can be a string if only a single one)
 
34
  *
35
  * @return bool Whether the IP is valid
36
  */
37
+ public static function checkIp(?string $requestIp, $ips)
38
  {
39
  if (!\is_array($ips)) {
40
  $ips = [$ips];
55
  * Compares two IPv4 addresses.
56
  * In case a subnet is given, it checks if it contains the request IP.
57
  *
58
+ * @param string $ip IPv4 address or subnet in CIDR notation
 
59
  *
60
  * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet
61
  */
62
+ public static function checkIp4(?string $requestIp, string $ip)
63
  {
64
  $cacheKey = $requestIp.'-'.$ip;
65
  if (isset(self::$checkedIps[$cacheKey])) {
66
  return self::$checkedIps[$cacheKey];
67
  }
68
 
69
+ if (!filter_var($requestIp, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) {
70
  return self::$checkedIps[$cacheKey] = false;
71
  }
72
 
73
  if (false !== strpos($ip, '/')) {
74
+ [$address, $netmask] = explode('/', $ip, 2);
75
 
76
  if ('0' === $netmask) {
77
+ return self::$checkedIps[$cacheKey] = filter_var($address, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4);
78
  }
79
 
80
  if ($netmask < 0 || $netmask > 32) {
100
  *
101
  * @see https://github.com/dsp/v6tools
102
  *
103
+ * @param string $ip IPv6 address or subnet in CIDR notation
 
104
  *
105
  * @return bool Whether the IP is valid
106
  *
107
  * @throws \RuntimeException When IPV6 support is not enabled
108
  */
109
+ public static function checkIp6(?string $requestIp, string $ip)
110
  {
111
  $cacheKey = $requestIp.'-'.$ip;
112
  if (isset(self::$checkedIps[$cacheKey])) {
118
  }
119
 
120
  if (false !== strpos($ip, '/')) {
121
+ [$address, $netmask] = explode('/', $ip, 2);
122
 
123
  if ('0' === $netmask) {
124
  return (bool) unpack('n*', @inet_pton($address));
vendor/symfony/http-foundation/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2019 Fabien Potencier
2
 
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
  of this software and associated documentation files (the "Software"), to deal
1
+ Copyright (c) 2004-2021 Fabien Potencier
2
 
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
  of this software and associated documentation files (the "Software"), to deal
vendor/symfony/polyfill-ctype/bootstrap.php CHANGED
@@ -11,6 +11,10 @@
11
 
12
  use Symfony\Polyfill\Ctype as p;
13
 
 
 
 
 
14
  if (!function_exists('ctype_alnum')) {
15
  function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
16
  }
11
 
12
  use Symfony\Polyfill\Ctype as p;
13
 
14
+ if (\PHP_VERSION_ID >= 80000) {
15
+ return require __DIR__.'/bootstrap80.php';
16
+ }
17
+
18
  if (!function_exists('ctype_alnum')) {
19
  function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
20
  }
vendor/symfony/polyfill-ctype/bootstrap80.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Ctype as p;
13
+
14
+ if (!function_exists('ctype_alnum')) {
15
+ function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); }
16
+ }
17
+ if (!function_exists('ctype_alpha')) {
18
+ function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); }
19
+ }
20
+ if (!function_exists('ctype_cntrl')) {
21
+ function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); }
22
+ }
23
+ if (!function_exists('ctype_digit')) {
24
+ function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); }
25
+ }
26
+ if (!function_exists('ctype_graph')) {
27
+ function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); }
28
+ }
29
+ if (!function_exists('ctype_lower')) {
30
+ function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); }
31
+ }
32
+ if (!function_exists('ctype_print')) {
33
+ function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); }
34
+ }
35
+ if (!function_exists('ctype_punct')) {
36
+ function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); }
37
+ }
38
+ if (!function_exists('ctype_space')) {
39
+ function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); }
40
+ }
41
+ if (!function_exists('ctype_upper')) {
42
+ function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); }
43
+ }
44
+ if (!function_exists('ctype_xdigit')) {
45
+ function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); }
46
+ }
vendor/symfony/polyfill-ctype/composer.json CHANGED
@@ -16,7 +16,7 @@
16
  }
17
  ],
18
  "require": {
19
- "php": ">=5.3.3"
20
  },
21
  "autoload": {
22
  "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
@@ -28,7 +28,7 @@
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
- "dev-master": "1.17-dev"
32
  },
33
  "thanks": {
34
  "name": "symfony/polyfill",
16
  }
17
  ],
18
  "require": {
19
+ "php": ">=7.1"
20
  },
21
  "autoload": {
22
  "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
+ "dev-main": "1.22-dev"
32
  },
33
  "thanks": {
34
  "name": "symfony/polyfill",
vendor/symfony/polyfill-intl-grapheme/Grapheme.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ namespace Symfony\Polyfill\Intl\Grapheme;
13
+
14
+ \define('SYMFONY_GRAPHEME_CLUSTER_RX', \PCRE_VERSION >= '8.32' ? '\X' : Grapheme::GRAPHEME_CLUSTER_RX);
15
+
16
+ /**
17
+ * Partial intl implementation in pure PHP.
18
+ *
19
+ * Implemented:
20
+ * - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8
21
+ * - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string
22
+ * - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack
23
+ * - grapheme_strlen - Get string length in grapheme units
24
+ * - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string
25
+ * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string
26
+ * - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string
27
+ * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack
28
+ * - grapheme_substr - Return part of a string
29
+ *
30
+ * @author Nicolas Grekas <p@tchwork.com>
31
+ *
32
+ * @internal
33
+ */
34
+ final class Grapheme
35
+ {
36
+ // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control])
37
+ // This regular expression is a work around for http://bugs.exim.org/1279
38
+ public const GRAPHEME_CLUSTER_RX = '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])';
39
+
40
+ public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
41
+ {
42
+ if (0 > $start) {
43
+ $start = \strlen($s) + $start;
44
+ }
45
+
46
+ if (!is_scalar($s)) {
47
+ $hasError = false;
48
+ set_error_handler(function () use (&$hasError) { $hasError = true; });
49
+ $next = substr($s, $start);
50
+ restore_error_handler();
51
+ if ($hasError) {
52
+ substr($s, $start);
53
+ $s = '';
54
+ } else {
55
+ $s = $next;
56
+ }
57
+ } else {
58
+ $s = substr($s, $start);
59
+ }
60
+ $size = (int) $size;
61
+ $type = (int) $type;
62
+ $start = (int) $start;
63
+
64
+ if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) {
65
+ if (80000 > \PHP_VERSION_ID) {
66
+ return false;
67
+ }
68
+
69
+ throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS');
70
+ }
71
+
72
+ if (!isset($s[0]) || 0 > $size || 0 > $start) {
73
+ return false;
74
+ }
75
+ if (0 === $size) {
76
+ return '';
77
+ }
78
+
79
+ $next = $start;
80
+
81
+ $s = preg_split('/('.SYMFONY_GRAPHEME_CLUSTER_RX.')/u', "\r\n".$s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE);
82
+
83
+ if (!isset($s[1])) {
84
+ return false;
85
+ }
86
+
87
+ $i = 1;
88
+ $ret = '';
89
+
90
+ do {
91
+ if (\GRAPHEME_EXTR_COUNT === $type) {
92
+ --$size;
93
+ } elseif (\GRAPHEME_EXTR_MAXBYTES === $type) {
94
+ $size -= \strlen($s[$i]);
95
+ } else {
96
+ $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
97
+ }
98
+
99
+ if ($size >= 0) {
100
+ $ret .= $s[$i];
101
+ }
102
+ } while (isset($s[++$i]) && $size > 0);
103
+
104
+ $next += \strlen($ret);
105
+
106
+ return $ret;
107
+ }
108
+
109
+ public static function grapheme_strlen($s)
110
+ {
111
+ preg_replace('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', '', $s, -1, $len);
112
+
113
+ return 0 === $len && '' !== $s ? null : $len;
114
+ }
115
+
116
+ public static function grapheme_substr($s, $start, $len = null)
117
+ {
118
+ if (null === $len) {
119
+ $len = 2147483647;
120
+ }
121
+
122
+ preg_match_all('/'.SYMFONY_GRAPHEME_CLUSTER_RX.'/u', $s, $s);
123
+
124
+ $slen = \count($s[0]);
125
+ $start = (int) $start;
126
+
127
+ if (0 > $start) {
128
+ $start += $slen;
129
+ }
130
+ if (0 > $start) {
131
+ if (\PHP_VERSION_ID < 80000) {
132
+ return false;
133
+ }
134
+
135
+ $start = 0;
136
+ }
137
+ if ($start >= $slen) {
138
+ return \PHP_VERSION_ID >= 80000 ? '' : false;
139
+ }
140
+
141
+ $rem = $slen - $start;
142
+
143
+ if (0 > $len) {
144
+ $len += $rem;
145
+ }
146
+ if (0 === $len) {
147
+ return '';
148
+ }
149
+ if (0 > $len) {
150
+ return \PHP_VERSION_ID >= 80000 ? '' : false;
151
+ }
152
+ if ($len > $rem) {
153
+ $len = $rem;
154
+ }
155
+
156
+ return implode('', \array_slice($s[0], $start, $len));
157
+ }
158
+
159
+ public static function grapheme_strpos($s, $needle, $offset = 0)
160
+ {
161
+ return self::grapheme_position($s, $needle, $offset, 0);
162
+ }
163
+
164
+ public static function grapheme_stripos($s, $needle, $offset = 0)
165
+ {
166
+ return self::grapheme_position($s, $needle, $offset, 1);
167
+ }
168
+
169
+ public static function grapheme_strrpos($s, $needle, $offset = 0)
170
+ {
171
+ return self::grapheme_position($s, $needle, $offset, 2);
172
+ }
173
+
174
+ public static function grapheme_strripos($s, $needle, $offset = 0)
175
+ {
176
+ return self::grapheme_position($s, $needle, $offset, 3);
177
+ }
178
+
179
+ public static function grapheme_stristr($s, $needle, $beforeNeedle = false)
180
+ {
181
+ return mb_stristr($s, $needle, $beforeNeedle, 'UTF-8');
182
+ }
183
+
184
+ public static function grapheme_strstr($s, $needle, $beforeNeedle = false)
185
+ {
186
+ return mb_strstr($s, $needle, $beforeNeedle, 'UTF-8');
187
+ }
188
+
189
+ private static function grapheme_position($s, $needle, $offset, $mode)
190
+ {
191
+ $needle = (string) $needle;
192
+ if (80000 > \PHP_VERSION_ID && !preg_match('/./us', $needle)) {
193
+ return false;
194
+ }
195
+ $s = (string) $s;
196
+ if (!preg_match('/./us', $s)) {
197
+ return false;
198
+ }
199
+ if ($offset > 0) {
200
+ $s = self::grapheme_substr($s, $offset);
201
+ } elseif ($offset < 0) {
202
+ if (2 > $mode) {
203
+ $offset += self::grapheme_strlen($s);
204
+ $s = self::grapheme_substr($s, $offset);
205
+ if (0 > $offset) {
206
+ $offset = 0;
207
+ }
208
+ } elseif (0 > $offset += self::grapheme_strlen($needle)) {
209
+ $s = self::grapheme_substr($s, 0, $offset);
210
+ $offset = 0;
211
+ } else {
212
+ $offset = 0;
213
+ }
214
+ }
215
+
216
+ // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8,
217
+ // we can use normal binary string functions here. For case-insensitive searches,
218
+ // case fold the strings first.
219
+ $caseInsensitive = $mode & 1;
220
+ $reverse = $mode & 2;
221
+ if ($caseInsensitive) {
222
+ // Use the same case folding mode as mbstring does for mb_stripos().
223
+ // Stick to SIMPLE case folding to avoid changing the length of the string, which
224
+ // might result in offsets being shifted.
225
+ $mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_UPPER;
226
+ $s = mb_convert_case($s, $mode, 'UTF-8');
227
+ $needle = mb_convert_case($needle, $mode, 'UTF-8');
228
+ }
229
+ if ($reverse) {
230
+ $needlePos = strrpos($s, $needle);
231
+ } else {
232
+ $needlePos = strpos($s, $needle);
233
+ }
234
+
235
+ return false !== $needlePos ? self::grapheme_strlen(substr($s, 0, $needlePos)) + $offset : false;
236
+ }
237
+ }
vendor/symfony/polyfill-intl-grapheme/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2015-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-intl-grapheme/README.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Intl: Grapheme
2
+ =================================
3
+
4
+ This component provides a partial, native PHP implementation of the
5
+ [Grapheme functions](https://php.net/intl.grapheme) from the
6
+ [Intl](https://php.net/intl) extension.
7
+
8
+ - [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme
9
+ clusters from a text buffer, which must be encoded in UTF-8
10
+ - [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units)
11
+ of first occurrence of a case-insensitive string
12
+ - [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string
13
+ from the first occurrence of case-insensitive needle to the end of haystack
14
+ - [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units
15
+ - [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units)
16
+ of first occurrence of a string
17
+ - [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units)
18
+ of last occurrence of a case-insensitive string
19
+ - [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units)
20
+ of last occurrence of a string
21
+ - [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from
22
+ the first occurrence of needle to the end of haystack
23
+ - [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string
24
+
25
+ More information can be found in the
26
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
27
+
28
+ License
29
+ =======
30
+
31
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-intl-grapheme/bootstrap.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Intl\Grapheme as p;
13
+
14
+ if (extension_loaded('intl')) {
15
+ return;
16
+ }
17
+
18
+ if (\PHP_VERSION_ID >= 80000) {
19
+ return require __DIR__.'/bootstrap80.php';
20
+ }
21
+
22
+ if (!defined('GRAPHEME_EXTR_COUNT')) {
23
+ define('GRAPHEME_EXTR_COUNT', 0);
24
+ }
25
+ if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
26
+ define('GRAPHEME_EXTR_MAXBYTES', 1);
27
+ }
28
+ if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
29
+ define('GRAPHEME_EXTR_MAXCHARS', 2);
30
+ }
31
+
32
+ if (!function_exists('grapheme_extract')) {
33
+ function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) { return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); }
34
+ }
35
+ if (!function_exists('grapheme_stripos')) {
36
+ function grapheme_stripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); }
37
+ }
38
+ if (!function_exists('grapheme_stristr')) {
39
+ function grapheme_stristr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); }
40
+ }
41
+ if (!function_exists('grapheme_strlen')) {
42
+ function grapheme_strlen($input) { return p\Grapheme::grapheme_strlen($input); }
43
+ }
44
+ if (!function_exists('grapheme_strpos')) {
45
+ function grapheme_strpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); }
46
+ }
47
+ if (!function_exists('grapheme_strripos')) {
48
+ function grapheme_strripos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); }
49
+ }
50
+ if (!function_exists('grapheme_strrpos')) {
51
+ function grapheme_strrpos($haystack, $needle, $offset = 0) { return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); }
52
+ }
53
+ if (!function_exists('grapheme_strstr')) {
54
+ function grapheme_strstr($haystack, $needle, $beforeNeedle = false) { return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); }
55
+ }
56
+ if (!function_exists('grapheme_substr')) {
57
+ function grapheme_substr($string, $offset, $length = null) { return p\Grapheme::grapheme_substr($string, $offset, $length); }
58
+ }
vendor/symfony/polyfill-intl-grapheme/bootstrap80.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Intl\Grapheme as p;
13
+
14
+ if (!defined('GRAPHEME_EXTR_COUNT')) {
15
+ define('GRAPHEME_EXTR_COUNT', 0);
16
+ }
17
+ if (!defined('GRAPHEME_EXTR_MAXBYTES')) {
18
+ define('GRAPHEME_EXTR_MAXBYTES', 1);
19
+ }
20
+ if (!defined('GRAPHEME_EXTR_MAXCHARS')) {
21
+ define('GRAPHEME_EXTR_MAXCHARS', 2);
22
+ }
23
+
24
+ /* Note YellowTree: In order to commit this to the plugin SVN of Wordpress, I needed to remove the return value typing */
25
+
26
+ if (!function_exists('grapheme_extract')) {
27
+ function grapheme_extract(?string $haystack, ?int $size, ?int $type = GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null) { return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); }
28
+ }
29
+ if (!function_exists('grapheme_stripos')) {
30
+ function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0) { return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); }
31
+ }
32
+ if (!function_exists('grapheme_stristr')) {
33
+ function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false) { return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
34
+ }
35
+ if (!function_exists('grapheme_strlen')) {
36
+ function grapheme_strlen(?string $string) { return p\Grapheme::grapheme_strlen((string) $string); }
37
+ }
38
+ if (!function_exists('grapheme_strpos')) {
39
+ function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0) { return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); }
40
+ }
41
+ if (!function_exists('grapheme_strripos')) {
42
+ function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0) { return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); }
43
+ }
44
+ if (!function_exists('grapheme_strrpos')) {
45
+ function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0) { return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); }
46
+ }
47
+ if (!function_exists('grapheme_strstr')) {
48
+ function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = false) { return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); }
49
+ }
50
+ if (!function_exists('grapheme_substr')) {
51
+ function grapheme_substr(?string $string, ?int $offset, ?int $length = null) { return p\Grapheme::grapheme_substr((string) $string, (int) $offset, (int) $length); }
52
+ }
vendor/symfony/polyfill-intl-grapheme/composer.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-intl-grapheme",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for intl's grapheme_* functions",
5
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "grapheme"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Nicolas Grekas",
11
+ "email": "p@tchwork.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=7.1"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" },
23
+ "files": [ "bootstrap.php" ]
24
+ },
25
+ "suggest": {
26
+ "ext-intl": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-main": "1.22-dev"
32
+ },
33
+ "thanks": {
34
+ "name": "symfony/polyfill",
35
+ "url": "https://github.com/symfony/polyfill"
36
+ }
37
+ }
38
+ }
vendor/symfony/polyfill-intl-normalizer/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2015-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-intl-normalizer/Normalizer.php ADDED
@@ -0,0 +1,310 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ namespace Symfony\Polyfill\Intl\Normalizer;
13
+
14
+ /**
15
+ * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.
16
+ *
17
+ * It has been validated with Unicode 6.3 Normalization Conformance Test.
18
+ * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.
19
+ *
20
+ * @author Nicolas Grekas <p@tchwork.com>
21
+ *
22
+ * @internal
23
+ */
24
+ class Normalizer
25
+ {
26
+ public const FORM_D = \Normalizer::FORM_D;
27
+ public const FORM_KD = \Normalizer::FORM_KD;
28
+ public const FORM_C = \Normalizer::FORM_C;
29
+ public const FORM_KC = \Normalizer::FORM_KC;
30
+ public const NFD = \Normalizer::NFD;
31
+ public const NFKD = \Normalizer::NFKD;
32
+ public const NFC = \Normalizer::NFC;
33
+ public const NFKC = \Normalizer::NFKC;
34
+
35
+ private static $C;
36
+ private static $D;
37
+ private static $KD;
38
+ private static $cC;
39
+ private static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
40
+ private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
41
+
42
+ public static function isNormalized(string $s, int $form = self::FORM_C)
43
+ {
44
+ if (!\in_array($form, [self::NFD, self::NFKD, self::NFC, self::NFKC])) {
45
+ return false;
46
+ }
47
+ if (!isset($s[strspn($s, self::$ASCII)])) {
48
+ return true;
49
+ }
50
+ if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) {
51
+ return true;
52
+ }
53
+
54
+ return self::normalize($s, $form) === $s;
55
+ }
56
+
57
+ public static function normalize(string $s, int $form = self::FORM_C)
58
+ {
59
+ if (!preg_match('//u', $s)) {
60
+ return false;
61
+ }
62
+
63
+ switch ($form) {
64
+ case self::NFC: $C = true; $K = false; break;
65
+ case self::NFD: $C = false; $K = false; break;
66
+ case self::NFKC: $C = true; $K = true; break;
67
+ case self::NFKD: $C = false; $K = true; break;
68
+ default:
69
+ if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) {
70
+ return $s;
71
+ }
72
+
73
+ if (80000 > \PHP_VERSION_ID) {
74
+ return false;
75
+ }
76
+
77
+ throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form');
78
+ }
79
+
80
+ if ('' === $s) {
81
+ return '';
82
+ }
83
+
84
+ if ($K && null === self::$KD) {
85
+ self::$KD = self::getData('compatibilityDecomposition');
86
+ }
87
+
88
+ if (null === self::$D) {
89
+ self::$D = self::getData('canonicalDecomposition');
90
+ self::$cC = self::getData('combiningClass');
91
+ }
92
+
93
+ if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) {
94
+ mb_internal_encoding('8bit');
95
+ }
96
+
97
+ $r = self::decompose($s, $K);
98
+
99
+ if ($C) {
100
+ if (null === self::$C) {
101
+ self::$C = self::getData('canonicalComposition');
102
+ }
103
+
104
+ $r = self::recompose($r);
105
+ }
106
+ if (null !== $mbEncoding) {
107
+ mb_internal_encoding($mbEncoding);
108
+ }
109
+
110
+ return $r;
111
+ }
112
+
113
+ private static function recompose($s)
114
+ {
115
+ $ASCII = self::$ASCII;
116
+ $compMap = self::$C;
117
+ $combClass = self::$cC;
118
+ $ulenMask = self::$ulenMask;
119
+
120
+ $result = $tail = '';
121
+
122
+ $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"];
123
+ $len = \strlen($s);
124
+
125
+ $lastUchr = substr($s, 0, $i);
126
+ $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0;
127
+
128
+ while ($i < $len) {
129
+ if ($s[$i] < "\x80") {
130
+ // ASCII chars
131
+
132
+ if ($tail) {
133
+ $lastUchr .= $tail;
134
+ $tail = '';
135
+ }
136
+
137
+ if ($j = strspn($s, $ASCII, $i + 1)) {
138
+ $lastUchr .= substr($s, $i, $j);
139
+ $i += $j;
140
+ }
141
+
142
+ $result .= $lastUchr;
143
+ $lastUchr = $s[$i];
144
+ $lastUcls = 0;
145
+ ++$i;
146
+ continue;
147
+ }
148
+
149
+ $ulen = $ulenMask[$s[$i] & "\xF0"];
150
+ $uchr = substr($s, $i, $ulen);
151
+
152
+ if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr
153
+ || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr
154
+ || $lastUcls) {
155
+ // Table lookup and combining chars composition
156
+
157
+ $ucls = $combClass[$uchr] ?? 0;
158
+
159
+ if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) {
160
+ $lastUchr = $compMap[$lastUchr.$uchr];
161
+ } elseif ($lastUcls = $ucls) {
162
+ $tail .= $uchr;
163
+ } else {
164
+ if ($tail) {
165
+ $lastUchr .= $tail;
166
+ $tail = '';
167
+ }
168
+
169
+ $result .= $lastUchr;
170
+ $lastUchr = $uchr;
171
+ }
172
+ } else {
173
+ // Hangul chars
174
+
175
+ $L = \ord($lastUchr[2]) - 0x80;
176
+ $V = \ord($uchr[2]) - 0xA1;
177
+ $T = 0;
178
+
179
+ $uchr = substr($s, $i + $ulen, 3);
180
+
181
+ if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") {
182
+ $T = \ord($uchr[2]) - 0xA7;
183
+ 0 > $T && $T += 0x40;
184
+ $ulen += 3;
185
+ }
186
+
187
+ $L = 0xAC00 + ($L * 21 + $V) * 28 + $T;
188
+ $lastUchr = \chr(0xE0 | $L >> 12).\chr(0x80 | $L >> 6 & 0x3F).\chr(0x80 | $L & 0x3F);
189
+ }
190
+
191
+ $i += $ulen;
192
+ }
193
+
194
+ return $result.$lastUchr.$tail;
195
+ }
196
+
197
+ private static function decompose($s, $c)
198
+ {
199
+ $result = '';
200
+
201
+ $ASCII = self::$ASCII;
202
+ $decompMap = self::$D;
203
+ $combClass = self::$cC;
204
+ $ulenMask = self::$ulenMask;
205
+ if ($c) {
206
+ $compatMap = self::$KD;
207
+ }
208
+
209
+ $c = [];
210
+ $i = 0;
211
+ $len = \strlen($s);
212
+
213
+ while ($i < $len) {
214
+ if ($s[$i] < "\x80") {
215
+ // ASCII chars
216
+
217
+ if ($c) {
218
+ ksort($c);
219
+ $result .= implode('', $c);
220
+ $c = [];
221
+ }
222
+
223
+ $j = 1 + strspn($s, $ASCII, $i + 1);
224
+ $result .= substr($s, $i, $j);
225
+ $i += $j;
226
+ continue;
227
+ }
228
+
229
+ $ulen = $ulenMask[$s[$i] & "\xF0"];
230
+ $uchr = substr($s, $i, $ulen);
231
+ $i += $ulen;
232
+
233
+ if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) {
234
+ // Table lookup
235
+
236
+ if ($uchr !== $j = $compatMap[$uchr] ?? ($decompMap[$uchr] ?? $uchr)) {
237
+ $uchr = $j;
238
+
239
+ $j = \strlen($uchr);
240
+ $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"];
241
+
242
+ if ($ulen != $j) {
243
+ // Put trailing chars in $s
244
+
245
+ $j -= $ulen;
246
+ $i -= $j;
247
+
248
+ if (0 > $i) {
249
+ $s = str_repeat(' ', -$i).$s;
250
+ $len -= $i;
251
+ $i = 0;
252
+ }
253
+
254
+ while ($j--) {
255
+ $s[$i + $j] = $uchr[$ulen + $j];
256
+ }
257
+
258
+ $uchr = substr($uchr, 0, $ulen);
259
+ }
260
+ }
261
+ if (isset($combClass[$uchr])) {
262
+ // Combining chars, for sorting
263
+
264
+ if (!isset($c[$combClass[$uchr]])) {
265
+ $c[$combClass[$uchr]] = '';
266
+ }
267
+ $c[$combClass[$uchr]] .= $uchr;
268
+ continue;
269
+ }
270
+ } else {
271
+ // Hangul chars
272
+
273
+ $uchr = unpack('C*', $uchr);
274
+ $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80;
275
+
276
+ $uchr = "\xE1\x84".\chr(0x80 + (int) ($j / 588))
277
+ ."\xE1\x85".\chr(0xA1 + (int) (($j % 588) / 28));
278
+
279
+ if ($j %= 28) {
280
+ $uchr .= $j < 25
281
+ ? ("\xE1\x86".\chr(0xA7 + $j))
282
+ : ("\xE1\x87".\chr(0x67 + $j));
283
+ }
284
+ }
285
+ if ($c) {
286
+ ksort($c);
287
+ $result .= implode('', $c);
288
+ $c = [];
289
+ }
290
+
291
+ $result .= $uchr;
292
+ }
293
+
294
+ if ($c) {
295
+ ksort($c);
296
+ $result .= implode('', $c);
297
+ }
298
+
299
+ return $result;
300
+ }
301
+
302
+ private static function getData($file)
303
+ {
304
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
305
+ return require $file;
306
+ }
307
+
308
+ return false;
309
+ }
310
+ }
vendor/symfony/polyfill-intl-normalizer/README.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Intl: Normalizer
2
+ ===================================
3
+
4
+ This component provides a fallback implementation for the
5
+ [`Normalizer`](https://php.net/Normalizer) class provided
6
+ by the [Intl](https://php.net/intl) extension.
7
+
8
+ More information can be found in the
9
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
10
+
11
+ License
12
+ =======
13
+
14
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Normalizer extends Symfony\Polyfill\Intl\Normalizer\Normalizer
4
+ {
5
+ /**
6
+ * @deprecated since ICU 56 and removed in PHP 8
7
+ */
8
+ public const NONE = 2;
9
+ public const FORM_D = 4;
10
+ public const FORM_KD = 8;
11
+ public const FORM_C = 16;
12
+ public const FORM_KC = 32;
13
+ public const NFD = 4;
14
+ public const NFKD = 8;
15
+ public const NFC = 16;
16
+ public const NFKC = 32;
17
+ }
vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php ADDED
@@ -0,0 +1,945 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'À' => 'À',
5
+ 'Á' => 'Á',
6
+ 'Â' => 'Â',
7
+ 'Ã' => 'Ã',
8
+ 'Ä' => 'Ä',
9
+ 'Å' => 'Å',
10
+ 'Ç' => 'Ç',
11
+ 'È' => 'È',
12
+ 'É' => 'É',
13
+ 'Ê' => 'Ê',
14
+ 'Ë' => 'Ë',
15
+ 'Ì' => 'Ì',
16
+ 'Í' => 'Í',
17
+ 'Î' => 'Î',
18
+ 'Ï' => 'Ï',
19
+ 'Ñ' => 'Ñ',
20
+ 'Ò' => 'Ò',
21
+ 'Ó' => 'Ó',
22
+ 'Ô' => 'Ô',
23
+ 'Õ' => 'Õ',
24
+ 'Ö' => 'Ö',
25
+ 'Ù' => 'Ù',
26
+ 'Ú' => 'Ú',
27
+ 'Û' => 'Û',
28
+ 'Ü' => 'Ü',
29
+ 'Ý' => 'Ý',
30
+ 'à' => 'à',
31
+ 'á' => 'á',
32
+ 'â' => 'â',
33
+ 'ã' => 'ã',
34
+ 'ä' => 'ä',
35
+ 'å' => 'å',
36
+ 'ç' => 'ç',
37
+ 'è' => 'è',
38
+ 'é' => 'é',
39
+ 'ê' => 'ê',
40
+ 'ë' => 'ë',
41
+ 'ì' => 'ì',
42
+ 'í' => 'í',
43
+ 'î' => 'î',
44
+ 'ï' => 'ï',
45
+ 'ñ' => 'ñ',
46
+ 'ò' => 'ò',
47
+ 'ó' => 'ó',
48
+ 'ô' => 'ô',
49
+ 'õ' => 'õ',
50
+ 'ö' => 'ö',
51
+ 'ù' => 'ù',
52
+ 'ú' => 'ú',
53
+ 'û' => 'û',
54
+ 'ü' => 'ü',
55
+ 'ý' => 'ý',
56
+ 'ÿ' => 'ÿ',
57
+ 'Ā' => 'Ā',
58
+ 'ā' => 'ā',
59
+ 'Ă' => 'Ă',
60
+ 'ă' => 'ă',
61
+ 'Ą' => 'Ą',
62
+ 'ą' => 'ą',
63
+ 'Ć' => 'Ć',
64
+ 'ć' => 'ć',
65
+ 'Ĉ' => 'Ĉ',
66
+ 'ĉ' => 'ĉ',
67
+ 'Ċ' => 'Ċ',
68
+ 'ċ' => 'ċ',
69
+ 'Č' => 'Č',
70
+ 'č' => 'č',
71
+ 'Ď' => 'Ď',
72
+ 'ď' => 'ď',
73
+ 'Ē' => 'Ē',
74
+ 'ē' => 'ē',
75
+ 'Ĕ' => 'Ĕ',
76
+ 'ĕ' => 'ĕ',
77
+ 'Ė' => 'Ė',
78
+ 'ė' => 'ė',
79
+ 'Ę' => 'Ę',
80
+ 'ę' => 'ę',
81
+ 'Ě' => 'Ě',
82
+ 'ě' => 'ě',
83
+ 'Ĝ' => 'Ĝ',
84
+ 'ĝ' => 'ĝ',
85
+ 'Ğ' => 'Ğ',
86
+ 'ğ' => 'ğ',
87
+ 'Ġ' => 'Ġ',
88
+ 'ġ' => 'ġ',
89
+ 'Ģ' => 'Ģ',
90
+ 'ģ' => 'ģ',
91
+ 'Ĥ' => 'Ĥ',
92
+ 'ĥ' => 'ĥ',
93
+ 'Ĩ' => 'Ĩ',
94
+ 'ĩ' => 'ĩ',
95
+ 'Ī' => 'Ī',
96
+ 'ī' => 'ī',
97
+ 'Ĭ' => 'Ĭ',
98
+ 'ĭ' => 'ĭ',
99
+ 'Į' => 'Į',
100
+ 'į' => 'į',
101
+ 'İ' => 'İ',
102
+ 'Ĵ' => 'Ĵ',
103
+ 'ĵ' => 'ĵ',
104
+ 'Ķ' => 'Ķ',
105
+ 'ķ' => 'ķ',
106
+ 'Ĺ' => 'Ĺ',
107
+ 'ĺ' => 'ĺ',
108
+ 'Ļ' => 'Ļ',
109
+ 'ļ' => 'ļ',
110
+ 'Ľ' => 'Ľ',
111
+ 'ľ' => 'ľ',
112
+ 'Ń' => 'Ń',
113
+ 'ń' => 'ń',
114
+ 'Ņ' => 'Ņ',
115
+ 'ņ' => 'ņ',
116
+ 'Ň' => 'Ň',
117
+ 'ň' => 'ň',
118
+ 'Ō' => 'Ō',
119
+ 'ō' => 'ō',
120
+ 'Ŏ' => 'Ŏ',
121
+ 'ŏ' => 'ŏ',
122
+ 'Ő' => 'Ő',
123
+ 'ő' => 'ő',
124
+ 'Ŕ' => 'Ŕ',
125
+ 'ŕ' => 'ŕ',
126
+ 'Ŗ' => 'Ŗ',
127
+ 'ŗ' => 'ŗ',
128
+ 'Ř' => 'Ř',
129
+ 'ř' => 'ř',
130
+ 'Ś' => 'Ś',
131
+ 'ś' => 'ś',
132
+ 'Ŝ' => 'Ŝ',
133
+ 'ŝ' => 'ŝ',
134
+ 'Ş' => 'Ş',
135
+ 'ş' => 'ş',
136
+ 'Š' => 'Š',
137
+ 'š' => 'š',
138
+ 'Ţ' => 'Ţ',
139
+ 'ţ' => 'ţ',
140
+ 'Ť' => 'Ť',
141
+ 'ť' => 'ť',
142
+ 'Ũ' => 'Ũ',
143
+ 'ũ' => 'ũ',
144
+ 'Ū' => 'Ū',
145
+ 'ū' => 'ū',
146
+ 'Ŭ' => 'Ŭ',
147
+ 'ŭ' => 'ŭ',
148
+ 'Ů' => 'Ů',
149
+ 'ů' => 'ů',
150
+ 'Ű' => 'Ű',
151
+ 'ű' => 'ű',
152
+ 'Ų' => 'Ų',
153
+ 'ų' => 'ų',
154
+ 'Ŵ' => 'Ŵ',
155
+ 'ŵ' => 'ŵ',
156
+ 'Ŷ' => 'Ŷ',
157
+ 'ŷ' => 'ŷ',
158
+ 'Ÿ' => 'Ÿ',
159
+ 'Ź' => 'Ź',
160
+ 'ź' => 'ź',
161
+ 'Ż' => 'Ż',
162
+ 'ż' => 'ż',
163
+ 'Ž' => 'Ž',
164
+ 'ž' => 'ž',
165
+ 'Ơ' => 'Ơ',
166
+ 'ơ' => 'ơ',
167
+ 'Ư' => 'Ư',
168
+ 'ư' => 'ư',
169
+ 'Ǎ' => 'Ǎ',
170
+ 'ǎ' => 'ǎ',
171
+ 'Ǐ' => 'Ǐ',
172
+ 'ǐ' => 'ǐ',
173
+ 'Ǒ' => 'Ǒ',
174
+ 'ǒ' => 'ǒ',
175
+ 'Ǔ' => 'Ǔ',
176
+ 'ǔ' => 'ǔ',
177
+ 'Ǖ' => 'Ǖ',
178
+ 'ǖ' => 'ǖ',
179
+ 'Ǘ' => 'Ǘ',
180
+ 'ǘ' => 'ǘ',
181
+ 'Ǚ' => 'Ǚ',
182
+ 'ǚ' => 'ǚ',
183
+ 'Ǜ' => 'Ǜ',
184
+ 'ǜ' => 'ǜ',
185
+ 'Ǟ' => 'Ǟ',
186
+ 'ǟ' => 'ǟ',
187
+ 'Ǡ' => 'Ǡ',
188
+ 'ǡ' => 'ǡ',
189
+ 'Ǣ' => 'Ǣ',
190
+ 'ǣ' => 'ǣ',
191
+ 'Ǧ' => 'Ǧ',
192
+ 'ǧ' => 'ǧ',
193
+ 'Ǩ' => 'Ǩ',
194
+ 'ǩ' => 'ǩ',
195
+ 'Ǫ' => 'Ǫ',
196
+ 'ǫ' => 'ǫ',
197
+ 'Ǭ' => 'Ǭ',
198
+ 'ǭ' => 'ǭ',
199
+ 'Ǯ' => 'Ǯ',
200
+ 'ǯ' => 'ǯ',
201
+ 'ǰ' => 'ǰ',
202
+ 'Ǵ' => 'Ǵ',
203
+ 'ǵ' => 'ǵ',
204
+ 'Ǹ' => 'Ǹ',
205
+ 'ǹ' => 'ǹ',
206
+ 'Ǻ' => 'Ǻ',
207
+ 'ǻ' => 'ǻ',
208
+ 'Ǽ' => 'Ǽ',
209
+ 'ǽ' => 'ǽ',
210
+ 'Ǿ' => 'Ǿ',
211
+ 'ǿ' => 'ǿ',
212
+ 'Ȁ' => 'Ȁ',
213
+ 'ȁ' => 'ȁ',
214
+ 'Ȃ' => 'Ȃ',
215
+ 'ȃ' => 'ȃ',
216
+ 'Ȅ' => 'Ȅ',
217
+ 'ȅ' => 'ȅ',
218
+ 'Ȇ' => 'Ȇ',
219
+ 'ȇ' => 'ȇ',
220
+ 'Ȉ' => 'Ȉ',
221
+ 'ȉ' => 'ȉ',
222
+ 'Ȋ' => 'Ȋ',
223
+ 'ȋ' => 'ȋ',
224
+ 'Ȍ' => 'Ȍ',
225
+ 'ȍ' => 'ȍ',
226
+ 'Ȏ' => 'Ȏ',
227
+ 'ȏ' => 'ȏ',
228
+ 'Ȑ' => 'Ȑ',
229
+ 'ȑ' => 'ȑ',
230
+ 'Ȓ' => 'Ȓ',
231
+ 'ȓ' => 'ȓ',
232
+ 'Ȕ' => 'Ȕ',
233
+ 'ȕ' => 'ȕ',
234
+ 'Ȗ' => 'Ȗ',
235
+ 'ȗ' => 'ȗ',
236
+ 'Ș' => 'Ș',
237
+ 'ș' => 'ș',
238
+ 'Ț' => 'Ț',
239
+ 'ț' => 'ț',
240
+ 'Ȟ' => 'Ȟ',
241
+ 'ȟ' => 'ȟ',
242
+ 'Ȧ' => 'Ȧ',
243
+ 'ȧ' => 'ȧ',
244
+ 'Ȩ' => 'Ȩ',
245
+ 'ȩ' => 'ȩ',
246
+ 'Ȫ' => 'Ȫ',
247
+ 'ȫ' => 'ȫ',
248
+ 'Ȭ' => 'Ȭ',
249
+ 'ȭ' => 'ȭ',
250
+ 'Ȯ' => 'Ȯ',
251
+ 'ȯ' => 'ȯ',
252
+ 'Ȱ' => 'Ȱ',
253
+ 'ȱ' => 'ȱ',
254
+ 'Ȳ' => 'Ȳ',
255
+ 'ȳ' => 'ȳ',
256
+ '΅' => '΅',
257
+ 'Ά' => 'Ά',
258
+ 'Έ' => 'Έ',
259
+ 'Ή' => 'Ή',
260
+ 'Ί' => 'Ί',
261
+ 'Ό' => 'Ό',
262
+ 'Ύ' => 'Ύ',
263
+ 'Ώ' => 'Ώ',
264
+ 'ΐ' => 'ΐ',
265
+ 'Ϊ' => 'Ϊ',
266
+ 'Ϋ' => 'Ϋ',
267
+ 'ά' => 'ά',
268
+ 'έ' => 'έ',
269
+ 'ή' => 'ή',
270
+ 'ί' => 'ί',
271
+ 'ΰ' => 'ΰ',
272
+ 'ϊ' => 'ϊ',
273
+ 'ϋ' => 'ϋ',
274
+ 'ό' => 'ό',
275
+ 'ύ' => 'ύ',
276
+ 'ώ' => 'ώ',
277
+ 'ϓ' => 'ϓ',
278
+ 'ϔ' => 'ϔ',
279
+ 'Ѐ' => 'Ѐ',
280
+ 'Ё' => 'Ё',
281
+ 'Ѓ' => 'Ѓ',
282
+ 'Ї' => 'Ї',
283
+ 'Ќ' => 'Ќ',
284
+ 'Ѝ' => 'Ѝ',
285
+ 'Ў' => 'Ў',
286
+ 'Й' => 'Й',
287
+ 'й' => 'й',
288
+ 'ѐ' => 'ѐ',
289
+ 'ё' => 'ё',
290
+ 'ѓ' => 'ѓ',
291
+ 'ї' => 'ї',
292
+ 'ќ' => 'ќ',
293
+ 'ѝ' => 'ѝ',
294
+ 'ў' => 'ў',
295
+ 'Ѷ' => 'Ѷ',
296
+ 'ѷ' => 'ѷ',
297
+ 'Ӂ' => 'Ӂ',
298
+ 'ӂ' => 'ӂ',
299
+ 'Ӑ' => 'Ӑ',
300
+ 'ӑ' => 'ӑ',
301
+ 'Ӓ' => 'Ӓ',
302
+ 'ӓ' => 'ӓ',
303
+ 'Ӗ' => 'Ӗ',
304
+ 'ӗ' => 'ӗ',
305
+ 'Ӛ' => 'Ӛ',
306
+ 'ӛ' => 'ӛ',
307
+ 'Ӝ' => 'Ӝ',
308
+ 'ӝ' => 'ӝ',
309
+ 'Ӟ' => 'Ӟ',
310
+ 'ӟ' => 'ӟ',
311
+ 'Ӣ' => 'Ӣ',
312
+ 'ӣ' => 'ӣ',
313
+ 'Ӥ' => 'Ӥ',
314
+ 'ӥ' => 'ӥ',
315
+ 'Ӧ' => 'Ӧ',
316
+ 'ӧ' => 'ӧ',
317
+ 'Ӫ' => 'Ӫ',
318
+ 'ӫ' => 'ӫ',
319
+ 'Ӭ' => 'Ӭ',
320
+ 'ӭ' => 'ӭ',
321
+ 'Ӯ' => 'Ӯ',
322
+ 'ӯ' => 'ӯ',
323
+ 'Ӱ' => 'Ӱ',
324
+ 'ӱ' => 'ӱ',
325
+ 'Ӳ' => 'Ӳ',
326
+ 'ӳ' => 'ӳ',
327
+ 'Ӵ' => 'Ӵ',
328
+ 'ӵ' => 'ӵ',
329
+ 'Ӹ' => 'Ӹ',
330
+ 'ӹ' => 'ӹ',
331
+ 'آ' => 'آ',
332
+ 'أ' => 'أ',
333
+ 'ؤ' => 'ؤ',
334
+ 'إ' => 'إ',
335
+ 'ئ' => 'ئ',
336
+ 'ۀ' => 'ۀ',
337
+ 'ۂ' => 'ۂ',
338
+ 'ۓ' => 'ۓ',
339
+ 'ऩ' => 'ऩ',
340
+ 'ऱ' => 'ऱ',
341
+ 'ऴ' => 'ऴ',
342
+ 'ো' => 'ো',
343
+ 'ৌ' => 'ৌ',
344
+ 'ୈ' => 'ୈ',
345
+ 'ୋ' => 'ୋ',
346
+ 'ୌ' => 'ୌ',
347
+ 'ஔ' => 'ஔ',
348
+ 'ொ' => 'ொ',
349
+ 'ோ' => 'ோ',
350
+ 'ௌ' => 'ௌ',
351
+ 'ై' => 'ై',
352
+ 'ೀ' => 'ೀ',
353
+ 'ೇ' => 'ೇ',
354
+ 'ೈ' => 'ೈ',
355
+ 'ೊ' => 'ೊ',
356
+ 'ೋ' => 'ೋ',
357
+ 'ൊ' => 'ൊ',
358
+ 'ോ' => 'ോ',
359
+ 'ൌ' => 'ൌ',
360
+ 'ේ' => 'ේ',
361
+ 'ො' => 'ො',
362
+ 'ෝ' => 'ෝ',
363
+ 'ෞ' => 'ෞ',
364
+ 'ဦ' => 'ဦ',
365
+ 'ᬆ' => 'ᬆ',
366
+ 'ᬈ' => 'ᬈ',
367
+ 'ᬊ' => 'ᬊ',
368
+ 'ᬌ' => 'ᬌ',
369
+ 'ᬎ' => 'ᬎ',
370
+ 'ᬒ' => 'ᬒ',
371
+ 'ᬻ' => 'ᬻ',
372
+ 'ᬽ' => 'ᬽ',
373
+ 'ᭀ' => 'ᭀ',
374
+ 'ᭁ' => 'ᭁ',
375
+ 'ᭃ' => 'ᭃ',
376
+ 'Ḁ' => 'Ḁ',
377
+ 'ḁ' => 'ḁ',
378
+ 'Ḃ' => 'Ḃ',
379
+ 'ḃ' => 'ḃ',
380
+ 'Ḅ' => 'Ḅ',
381
+ 'ḅ' => 'ḅ',
382
+ 'Ḇ' => 'Ḇ',
383
+ 'ḇ' => 'ḇ',
384
+ 'Ḉ' => 'Ḉ',
385
+ 'ḉ' => 'ḉ',
386
+ 'Ḋ' => 'Ḋ',
387
+ 'ḋ' => 'ḋ',
388
+ 'Ḍ' => 'Ḍ',
389
+ 'ḍ' => 'ḍ',
390
+ 'Ḏ' => 'Ḏ',
391
+ 'ḏ' => 'ḏ',
392
+ 'Ḑ' => 'Ḑ',
393
+ 'ḑ' => 'ḑ',
394
+ 'Ḓ' => 'Ḓ',
395
+ 'ḓ' => 'ḓ',
396
+ 'Ḕ' => 'Ḕ',
397
+ 'ḕ' => 'ḕ',
398
+ 'Ḗ' => 'Ḗ',
399
+ 'ḗ' => 'ḗ',
400
+ 'Ḙ' => 'Ḙ',
401
+ 'ḙ' => 'ḙ',
402
+ 'Ḛ' => 'Ḛ',
403
+ 'ḛ' => 'ḛ',
404
+ 'Ḝ' => 'Ḝ',
405
+ 'ḝ' => 'ḝ',
406
+ 'Ḟ' => 'Ḟ',
407
+ 'ḟ' => 'ḟ',
408
+ 'Ḡ' => 'Ḡ',
409
+ 'ḡ' => 'ḡ',
410
+ 'Ḣ' => 'Ḣ',
411
+ 'ḣ' => 'ḣ',
412
+ 'Ḥ' => 'Ḥ',
413
+ 'ḥ' => 'ḥ',
414
+ 'Ḧ' => 'Ḧ',
415
+ 'ḧ' => 'ḧ',
416
+ 'Ḩ' => 'Ḩ',
417
+ 'ḩ' => 'ḩ',
418
+ 'Ḫ' => 'Ḫ',
419
+ 'ḫ' => 'ḫ',
420
+ 'Ḭ' => 'Ḭ',
421
+ 'ḭ' => 'ḭ',
422
+ 'Ḯ' => 'Ḯ',
423
+ 'ḯ' => 'ḯ',
424
+ 'Ḱ' => 'Ḱ',
425
+ 'ḱ' => 'ḱ',
426
+ 'Ḳ' => 'Ḳ',
427
+ 'ḳ' => 'ḳ',
428
+ 'Ḵ' => 'Ḵ',
429
+ 'ḵ' => 'ḵ',
430
+ 'Ḷ' => 'Ḷ',
431
+ 'ḷ' => 'ḷ',
432
+ 'Ḹ' => 'Ḹ',
433
+ 'ḹ' => 'ḹ',
434
+ 'Ḻ' => 'Ḻ',
435
+ 'ḻ' => 'ḻ',
436
+ 'Ḽ' => 'Ḽ',
437
+ 'ḽ' => 'ḽ',
438
+ 'Ḿ' => 'Ḿ',
439
+ 'ḿ' => 'ḿ',
440
+ 'Ṁ' => 'Ṁ',
441
+ 'ṁ' => 'ṁ',
442
+ 'Ṃ' => 'Ṃ',
443
+ 'ṃ' => 'ṃ',
444
+ 'Ṅ' => 'Ṅ',
445
+ 'ṅ' => 'ṅ',
446
+ 'Ṇ' => 'Ṇ',
447
+ 'ṇ' => 'ṇ',
448
+ 'Ṉ' => 'Ṉ',
449
+ 'ṉ' => 'ṉ',
450
+ 'Ṋ' => 'Ṋ',
451
+ 'ṋ' => 'ṋ',
452
+ 'Ṍ' => 'Ṍ',
453
+ 'ṍ' => 'ṍ',
454
+ 'Ṏ' => 'Ṏ',
455
+ 'ṏ' => 'ṏ',
456
+ 'Ṑ' => 'Ṑ',
457
+ 'ṑ' => 'ṑ',
458
+ 'Ṓ' => 'Ṓ',
459
+ 'ṓ' => 'ṓ',
460
+ 'Ṕ' => 'Ṕ',
461
+ 'ṕ' => 'ṕ',
462
+ 'Ṗ' => 'Ṗ',
463
+ 'ṗ' => 'ṗ',
464
+ 'Ṙ' => 'Ṙ',
465
+ 'ṙ' => 'ṙ',
466
+ 'Ṛ' => 'Ṛ',
467
+ 'ṛ' => 'ṛ',
468
+ 'Ṝ' => 'Ṝ',
469
+ 'ṝ' => 'ṝ',
470
+ 'Ṟ' => 'Ṟ',
471
+ 'ṟ' => 'ṟ',
472
+ 'Ṡ' => 'Ṡ',
473
+ 'ṡ' => 'ṡ',
474
+ 'Ṣ' => 'Ṣ',
475
+ 'ṣ' => 'ṣ',
476
+ 'Ṥ' => 'Ṥ',
477
+ 'ṥ' => 'ṥ',
478
+ 'Ṧ' => 'Ṧ',
479
+ 'ṧ' => 'ṧ',
480
+ 'Ṩ' => 'Ṩ',
481
+ 'ṩ' => 'ṩ',
482
+ 'Ṫ' => 'Ṫ',
483
+ 'ṫ' => 'ṫ',
484
+ 'Ṭ' => 'Ṭ',
485
+ 'ṭ' => 'ṭ',
486
+ 'Ṯ' => 'Ṯ',
487
+ 'ṯ' => 'ṯ',
488
+ 'Ṱ' => 'Ṱ',
489
+ 'ṱ' => 'ṱ',
490
+ 'Ṳ' => 'Ṳ',
491
+ 'ṳ' => 'ṳ',
492
+ 'Ṵ' => 'Ṵ',
493
+ 'ṵ' => 'ṵ',
494
+ 'Ṷ' => 'Ṷ',
495
+ 'ṷ' => 'ṷ',
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
+ 'Ể' => 'Ể',
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
+ 'Ἔ' => 'Ἔ',
648
+ 'Ἕ' => 'Ἕ',
649
+ 'ἠ' => 'ἠ',
650
+ 'ἡ' => 'ἡ',
651
+ 'ἢ' => 'ἢ',
652
+ 'ἣ' => 'ἣ',
653
+ 'ἤ' => 'ἤ',
654
+ 'ἥ' => 'ἥ',
655
+ 'ἦ' => 'ἦ',
656
+ 'ἧ' => 'ἧ',
657
+ 'Ἠ' => 'Ἠ',
658
+ 'Ἡ' => 'Ἡ',
659
+ 'Ἢ' => 'Ἢ',
660
+ 'Ἣ' => 'Ἣ',
661
+ 'Ἤ' => 'Ἤ',
662
+ 'Ἥ' => 'Ἥ',
663
+ 'Ἦ' => 'Ἦ',
664
+ 'Ἧ' => 'Ἧ',
665
+ 'ἰ' => 'ἰ',
666
+ 'ἱ' => 'ἱ',
667
+ 'ἲ' => 'ἲ',
668
+ 'ἳ' => 'ἳ',
669
+ 'ἴ' => 'ἴ',
670
+ 'ἵ' => 'ἵ',
671
+ 'ἶ' => 'ἶ',
672
+ 'ἷ' => 'ἷ',
673
+ 'Ἰ' => 'Ἰ',
674
+ 'Ἱ' => 'Ἱ',
675
+ 'Ἲ' => 'Ἲ',
676
+ 'Ἳ' => 'Ἳ',
677
+ 'Ἴ' => 'Ἴ',
678
+ 'Ἵ' => 'Ἵ',
679
+ 'Ἶ' => 'Ἶ',
680
+ 'Ἷ' => 'Ἷ',
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
+ 'ὰ' => 'ὰ',
722
+ 'ὲ' => 'ὲ',
723
+ 'ὴ' => 'ὴ',
724
+ 'ὶ' => 'ὶ',
725
+ 'ὸ' => 'ὸ',
726
+ 'ὺ' => 'ὺ',
727
+ 'ὼ' => 'ὼ',
728
+ 'ᾀ' => 'ᾀ',
729
+ 'ᾁ' => 'ᾁ',
730
+ 'ᾂ' => 'ᾂ',
731
+ 'ᾃ' => 'ᾃ',
732
+ 'ᾄ' => 'ᾄ',
733
+ 'ᾅ' => 'ᾅ',
734
+ 'ᾆ' => 'ᾆ',
735
+ 'ᾇ' => 'ᾇ',
736
+ 'ᾈ' => 'ᾈ',
737
+ 'ᾉ' => 'ᾉ',
738
+ 'ᾊ' => 'ᾊ',
739
+ 'ᾋ' => 'ᾋ',
740
+ 'ᾌ' => 'ᾌ',
741
+ 'ᾍ' => 'ᾍ',
742
+ 'ᾎ' => 'ᾎ',
743
+ 'ᾏ' => 'ᾏ',
744
+ 'ᾐ' => 'ᾐ',
745
+ 'ᾑ' => 'ᾑ',
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
+ 'ᾼ' => 'ᾼ',
787
+ '῁' => '῁',
788
+ 'ῂ' => 'ῂ',
789
+ 'ῃ' => 'ῃ',
790
+ 'ῄ' => 'ῄ',
791
+ 'ῆ' => 'ῆ',
792
+ 'ῇ' => 'ῇ',
793
+ 'Ὲ' => 'Ὲ',
794
+ 'Ὴ' => 'Ὴ',
795
+ 'ῌ' => 'ῌ',
796
+ '῍' => '῍',
797
+ '῎' => '῎',
798
+ '῏' => '῏',
799
+ 'ῐ' => 'ῐ',
800
+ 'ῑ' => 'ῑ',
801
+ 'ῒ' => 'ῒ',
802
+ 'ῖ' => 'ῖ',
803
+ 'ῗ' => 'ῗ',
804
+ 'Ῐ' => 'Ῐ',
805
+ 'Ῑ' => 'Ῑ',
806
+ 'Ὶ' => 'Ὶ',
807
+ '῝' => '῝',
808
+ '῞' => '῞',
809
+ '῟' => '῟',
810
+ 'ῠ' => 'ῠ',
811
+ 'ῡ' => 'ῡ',
812
+ 'ῢ' => 'ῢ',
813
+ 'ῤ' => 'ῤ',
814
+ 'ῥ' => 'ῥ',
815
+ 'ῦ' => 'ῦ',
816
+ 'ῧ' => 'ῧ',
817
+ 'Ῠ' => 'Ῠ',
818
+ 'Ῡ' => 'Ῡ',
819
+ 'Ὺ' => 'Ὺ',
820
+ 'Ῥ' => 'Ῥ',
821
+ '῭' => '῭',
822
+ 'ῲ' => 'ῲ',
823
+ 'ῳ' => 'ῳ',
824
+ 'ῴ' => 'ῴ',
825
+ 'ῶ' => 'ῶ',
826
+ 'ῷ' => 'ῷ',
827
+ 'Ὸ' => 'Ὸ',
828
+ 'Ὼ' => 'Ὼ',
829
+ 'ῼ' => 'ῼ',
830
+ '↚' => '↚',
831
+ '↛' => '↛',
832
+ '↮' => '↮',
833
+ '⇍' => '⇍',
834
+ '⇎' => '⇎',
835
+ '⇏' => '⇏',
836
+ '∄' => '∄',
837
+ '∉' => '∉',
838
+ '∌' => '∌',
839
+ '∤' => '∤',
840
+ '∦' => '∦',
841
+ '≁' => '≁',
842
+ '≄' => '≄',
843
+ '≇' => '≇',
844
+ '≉' => '≉',
845
+ '≠' => '≠',
846
+ '≢' => '≢',
847
+ '≭' => '≭',
848
+ '≮' => '≮',
849
+ '≯' => '≯',
850
+ '≰' => '≰',
851
+ '≱' => '≱',
852
+ '≴' => '≴',
853
+ '≵' => '≵',
854
+ '≸' => '≸',
855
+ '≹' => '≹',
856
+ '⊀' => '⊀',
857
+ '⊁' => '⊁',
858
+ '⊄' => '⊄',
859
+ '⊅' => '⊅',
860
+ '⊈' => '⊈',
861
+ '⊉' => '⊉',
862
+ '⊬' => '⊬',
863
+ '⊭' => '⊭',
864
+ '⊮' => '⊮',
865
+ '⊯' => '⊯',
866
+ '⋠' => '⋠',
867
+ '⋡' => '⋡',
868
+ '⋢' => '⋢',
869
+ '⋣' => '⋣',
870
+ '⋪' => '⋪',
871
+ '⋫' => '⋫',
872
+ '⋬' => '⋬',
873
+ '⋭' => '⋭',
874
+ 'が' => 'が',
875
+ 'ぎ' => 'ぎ',
876
+ 'ぐ' => 'ぐ',
877
+ 'げ' => 'げ',
878
+ 'ご' => 'ご',
879
+ 'ざ' => 'ざ',
880
+ 'じ' => 'じ',
881
+ 'ず' => 'ず',
882
+ 'ぜ' => 'ぜ',
883
+ 'ぞ' => 'ぞ',
884
+ 'だ' => 'だ',
885
+ 'ぢ' => 'ぢ',
886
+ 'づ' => 'づ',
887
+ 'で' => 'で',
888
+ 'ど' => 'ど',
889
+ 'ば' => 'ば',
890
+ 'ぱ' => 'ぱ',
891
+ 'び' => 'び',
892
+ 'ぴ' => 'ぴ',
893
+ 'ぶ' => 'ぶ',
894
+ 'ぷ' => 'ぷ',
895
+ 'べ' => 'べ',
896
+ 'ぺ' => 'ぺ',
897
+ 'ぼ' => 'ぼ',
898
+ 'ぽ' => 'ぽ',
899
+ 'ゔ' => 'ゔ',
900
+ 'ゞ' => 'ゞ',
901
+ 'ガ' => 'ガ',
902
+ 'ギ' => 'ギ',
903
+ 'グ' => 'グ',
904
+ 'ゲ' => 'ゲ',
905
+ 'ゴ' => 'ゴ',
906
+ 'ザ' => 'ザ',
907
+ 'ジ' => 'ジ',
908
+ 'ズ' => 'ズ',
909
+ 'ゼ' => 'ゼ',
910
+ 'ゾ' => 'ゾ',
911
+ 'ダ' => 'ダ',
912
+ 'ヂ' => 'ヂ',
913
+ 'ヅ' => 'ヅ',
914
+ 'デ' => 'デ',
915
+ 'ド' => 'ド',
916
+ 'バ' => 'バ',
917
+ 'パ' => 'パ',
918
+ 'ビ' => 'ビ',
919
+ 'ピ' => 'ピ',
920
+ 'ブ' => 'ブ',
921
+ 'プ' => 'プ',
922
+ 'ベ' => 'ベ',
923
+ 'ペ' => 'ペ',
924
+ 'ボ' => 'ボ',
925
+ 'ポ' => 'ポ',
926
+ 'ヴ' => 'ヴ',
927
+ 'ヷ' => 'ヷ',
928
+ 'ヸ' => 'ヸ',
929
+ 'ヹ' => 'ヹ',
930
+ 'ヺ' => 'ヺ',
931
+ 'ヾ' => 'ヾ',
932
+ '𑂚' => '𑂚',
933
+ '𑂜' => '𑂜',
934
+ '𑂫' => '𑂫',
935
+ '𑄮' => '𑄮',
936
+ '𑄯' => '𑄯',
937
+ '𑍋' => '𑍋',
938
+ '𑍌' => '𑍌',
939
+ '𑒻' => '𑒻',
940
+ '𑒼' => '𑒼',
941
+ '𑒾' => '𑒾',
942
+ '𑖺' => '𑖺',
943
+ '𑖻' => '𑖻',
944
+ '𑤸' => '𑤸',
945
+ );
vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php ADDED
@@ -0,0 +1,2065 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'À' => 'À',
5
+ 'Á' => 'Á',
6
+ 'Â' => 'Â',
7
+ 'Ã' => 'Ã',
8
+ 'Ä' => 'Ä',
9
+ 'Å' => 'Å',
10
+ 'Ç' => 'Ç',
11
+ 'È' => 'È',
12
+ 'É' => 'É',
13
+ 'Ê' => 'Ê',
14
+ 'Ë' => 'Ë',
15
+ 'Ì' => 'Ì',
16
+ 'Í' => 'Í',
17
+ 'Î' => 'Î',
18
+ 'Ï' => 'Ï',
19
+ 'Ñ' => 'Ñ',
20
+ 'Ò' => 'Ò',
21
+ 'Ó' => 'Ó',
22
+ 'Ô' => 'Ô',
23
+ 'Õ' => 'Õ',
24
+ 'Ö' => 'Ö',
25
+ 'Ù' => 'Ù',
26
+ 'Ú' => 'Ú',
27
+ 'Û' => 'Û',
28
+ 'Ü' => 'Ü',
29
+ 'Ý' => 'Ý',
30
+ 'à' => 'à',
31
+ 'á' => 'á',
32
+ 'â' => 'â',
33
+ 'ã' => 'ã',
34
+ 'ä' => 'ä',
35
+ 'å' => 'å',
36
+ 'ç' => 'ç',
37
+ 'è' => 'è',
38
+ 'é' => 'é',
39
+ 'ê' => 'ê',
40
+ 'ë' => 'ë',
41
+ 'ì' => 'ì',
42
+ 'í' => 'í',
43
+ 'î' => 'î',
44
+ 'ï' => 'ï',
45
+ 'ñ' => 'ñ',
46
+ 'ò' => 'ò',
47
+ 'ó' => 'ó',
48
+ 'ô' => 'ô',
49
+ 'õ' => 'õ',
50
+ 'ö' => 'ö',
51
+ 'ù' => 'ù',
52
+ 'ú' => 'ú',
53
+ 'û' => 'û',
54
+ 'ü' => 'ü',
55
+ 'ý' => 'ý',
56
+ 'ÿ' => 'ÿ',
57
+ 'Ā' => 'Ā',
58
+ 'ā' => 'ā',
59
+ 'Ă' => 'Ă',
60
+ 'ă' => 'ă',
61
+ 'Ą' => 'Ą',
62
+ 'ą' => 'ą',
63
+ 'Ć' => 'Ć',
64
+ 'ć' => 'ć',
65
+ 'Ĉ' => 'Ĉ',
66
+ 'ĉ' => 'ĉ',
67
+ 'Ċ' => 'Ċ',
68
+ 'ċ' => 'ċ',
69
+ 'Č' => 'Č',
70
+ 'č' => 'č',
71
+ 'Ď' => 'Ď',
72
+ 'ď' => 'ď',
73
+ 'Ē' => 'Ē',
74
+ 'ē' => 'ē',
75
+ 'Ĕ' => 'Ĕ',
76
+ 'ĕ' => 'ĕ',
77
+ 'Ė' => 'Ė',
78
+ 'ė' => 'ė',
79
+ 'Ę' => 'Ę',
80
+ 'ę' => 'ę',
81
+ 'Ě' => 'Ě',
82
+ 'ě' => 'ě',
83
+ 'Ĝ' => 'Ĝ',
84
+ 'ĝ' => 'ĝ',
85
+ 'Ğ' => 'Ğ',
86
+ 'ğ' => 'ğ',
87
+ 'Ġ' => 'Ġ',
88
+ 'ġ' => 'ġ',
89
+ 'Ģ' => 'Ģ',
90
+ 'ģ' => 'ģ',
91
+ 'Ĥ' => 'Ĥ',
92
+ 'ĥ' => 'ĥ',
93
+ 'Ĩ' => 'Ĩ',
94
+ 'ĩ' => 'ĩ',
95
+ 'Ī' => 'Ī',
96
+ 'ī' => 'ī',
97
+ 'Ĭ' => 'Ĭ',
98
+ 'ĭ' => 'ĭ',
99
+ 'Į' => 'Į',
100
+ 'į' => 'į',
101
+ 'İ' => 'İ',
102
+ 'Ĵ' => 'Ĵ',
103
+ 'ĵ' => 'ĵ',
104
+ 'Ķ' => 'Ķ',
105
+ 'ķ' => 'ķ',
106
+ 'Ĺ' => 'Ĺ',
107
+ 'ĺ' => 'ĺ',
108
+ 'Ļ' => 'Ļ',
109
+ 'ļ' => 'ļ',
110
+ 'Ľ' => 'Ľ',
111
+ 'ľ' => 'ľ',
112
+ 'Ń' => 'Ń',
113
+ 'ń' => 'ń',
114
+ 'Ņ' => 'Ņ',
115
+ 'ņ' => 'ņ',
116
+ 'Ň' => 'Ň',
117
+ 'ň' => 'ň',
118
+ 'Ō' => 'Ō',
119
+ 'ō' => 'ō',
120
+ 'Ŏ' => 'Ŏ',
121
+ 'ŏ' => 'ŏ',
122
+ 'Ő' => 'Ő',
123
+ 'ő' => 'ő',
124
+ 'Ŕ' => 'Ŕ',
125
+ 'ŕ' => 'ŕ',
126
+ 'Ŗ' => 'Ŗ',
127
+ 'ŗ' => 'ŗ',
128
+ 'Ř' => 'Ř',
129
+ 'ř' => 'ř',
130
+ 'Ś' => 'Ś',
131
+ 'ś' => 'ś',
132
+ 'Ŝ' => 'Ŝ',
133
+ 'ŝ' => 'ŝ',
134
+ 'Ş' => 'Ş',
135
+ 'ş' => 'ş',
136
+ 'Š' => 'Š',
137
+ 'š' => 'š',
138
+ 'Ţ' => 'Ţ',
139
+ 'ţ' => 'ţ',
140
+ 'Ť' => 'Ť',
141
+ 'ť' => 'ť',
142
+ 'Ũ' => 'Ũ',
143
+ 'ũ' => 'ũ',
144
+ 'Ū' => 'Ū',
145
+ 'ū' => 'ū',
146
+ 'Ŭ' => 'Ŭ',
147
+ 'ŭ' => 'ŭ',
148
+ 'Ů' => 'Ů',
149
+ 'ů' => 'ů',
150
+ 'Ű' => 'Ű',
151
+ 'ű' => 'ű',
152
+ 'Ų' => 'Ų',
153
+ 'ų' => 'ų',
154
+ 'Ŵ' => 'Ŵ',
155
+ 'ŵ' => 'ŵ',
156
+ 'Ŷ' => 'Ŷ',
157
+ 'ŷ' => 'ŷ',
158
+ 'Ÿ' => 'Ÿ',
159
+ 'Ź' => 'Ź',
160
+ 'ź' => 'ź',
161
+ 'Ż' => 'Ż',
162
+ 'ż' => 'ż',
163
+ 'Ž' => 'Ž',
164
+ 'ž' => 'ž',
165
+ 'Ơ' => 'Ơ',
166
+ 'ơ' => 'ơ',
167
+ 'Ư' => 'Ư',
168
+ 'ư' => 'ư',
169
+ 'Ǎ' => 'Ǎ',
170
+ 'ǎ' => 'ǎ',
171
+ 'Ǐ' => 'Ǐ',
172
+ 'ǐ' => 'ǐ',
173
+ 'Ǒ' => 'Ǒ',
174
+ 'ǒ' => 'ǒ',
175
+ 'Ǔ' => 'Ǔ',
176
+ 'ǔ' => 'ǔ',
177
+ 'Ǖ' => 'Ǖ',
178
+ 'ǖ' => 'ǖ',
179
+ 'Ǘ' => 'Ǘ',
180
+ 'ǘ' => 'ǘ',
181
+ 'Ǚ' => 'Ǚ',
182
+ 'ǚ' => 'ǚ',
183
+ 'Ǜ' => 'Ǜ',
184
+ 'ǜ' => 'ǜ',
185
+ 'Ǟ' => 'Ǟ',
186
+ 'ǟ' => 'ǟ',
187
+ 'Ǡ' => 'Ǡ',
188
+ 'ǡ' => 'ǡ',
189
+ 'Ǣ' => 'Ǣ',
190
+ 'ǣ' => 'ǣ',
191
+ 'Ǧ' => 'Ǧ',
192
+ 'ǧ' => 'ǧ',
193
+ 'Ǩ' => 'Ǩ',
194
+ 'ǩ' => 'ǩ',
195
+ 'Ǫ' => 'Ǫ',
196
+ 'ǫ' => 'ǫ',
197
+ 'Ǭ' => 'Ǭ',
198
+ 'ǭ' => 'ǭ',
199
+ 'Ǯ' => 'Ǯ',
200
+ 'ǯ' => 'ǯ',
201
+ 'ǰ' => 'ǰ',
202
+ 'Ǵ' => 'Ǵ',
203
+ 'ǵ' => 'ǵ',
204
+ 'Ǹ' => 'Ǹ',
205
+ 'ǹ' => 'ǹ',
206
+ 'Ǻ' => 'Ǻ',
207
+ 'ǻ' => 'ǻ',
208
+ 'Ǽ' => 'Ǽ',
209
+ 'ǽ' => 'ǽ',
210
+ 'Ǿ' => 'Ǿ',
211
+ 'ǿ' => 'ǿ',
212
+ 'Ȁ' => 'Ȁ',
213
+ 'ȁ' => 'ȁ',
214
+ 'Ȃ' => 'Ȃ',
215
+ 'ȃ' => 'ȃ',
216
+ 'Ȅ' => 'Ȅ',
217
+ 'ȅ' => 'ȅ',
218
+ 'Ȇ' => 'Ȇ',
219
+ 'ȇ' => 'ȇ',
220
+ 'Ȉ' => 'Ȉ',
221
+ 'ȉ' => 'ȉ',
222
+ 'Ȋ' => 'Ȋ',
223
+ 'ȋ' => 'ȋ',
224
+ 'Ȍ' => 'Ȍ',
225
+ 'ȍ' => 'ȍ',
226
+ 'Ȏ' => 'Ȏ',
227
+ 'ȏ' => 'ȏ',
228
+ 'Ȑ' => 'Ȑ',
229
+ 'ȑ' => 'ȑ',
230
+ 'Ȓ' => 'Ȓ',
231
+ 'ȓ' => 'ȓ',
232
+ 'Ȕ' => 'Ȕ',
233
+ 'ȕ' => 'ȕ',
234
+ 'Ȗ' => 'Ȗ',
235
+ 'ȗ' => 'ȗ',
236
+ 'Ș' => 'Ș',
237
+ 'ș' => 'ș',
238
+ 'Ț' => 'Ț',
239
+ 'ț' => 'ț',
240
+ 'Ȟ' => 'Ȟ',
241
+ 'ȟ' => 'ȟ',
242
+ 'Ȧ' => 'Ȧ',
243
+ 'ȧ' => 'ȧ',
244
+ 'Ȩ' => 'Ȩ',
245
+ 'ȩ' => 'ȩ',
246
+ 'Ȫ' => 'Ȫ',
247
+ 'ȫ' => 'ȫ',
248
+ 'Ȭ' => 'Ȭ',
249
+ 'ȭ' => 'ȭ',
250
+ 'Ȯ' => 'Ȯ',
251
+ 'ȯ' => 'ȯ',
252
+ 'Ȱ' => 'Ȱ',
253
+ 'ȱ' => 'ȱ',
254
+ 'Ȳ' => 'Ȳ',
255
+ 'ȳ' => 'ȳ',
256
+ '̀' => '̀',
257
+ '́' => '́',
258
+ '̓' => '̓',
259
+ '̈́' => '̈́',
260
+ 'ʹ' => 'ʹ',
261
+ ';' => ';',
262
+ '΅' => '΅',
263
+ 'Ά' => 'Ά',
264
+ '·' => '·',
265
+ 'Έ' => 'Έ',
266
+ 'Ή' => 'Ή',
267
+ 'Ί' => 'Ί',
268
+ 'Ό' => 'Ό',
269
+ 'Ύ' => 'Ύ',
270
+ 'Ώ' => 'Ώ',
271
+ 'ΐ' => 'ΐ',
272
+ 'Ϊ' => 'Ϊ',
273
+ 'Ϋ' => 'Ϋ',
274
+ 'ά' => 'ά',
275
+ 'έ' => 'έ',
276
+ 'ή' => 'ή',
277
+ 'ί' => 'ί',
278
+ 'ΰ' => 'ΰ',
279
+ 'ϊ' => 'ϊ',
280
+ 'ϋ' => 'ϋ',
281
+ 'ό' => 'ό',
282
+ 'ύ' => 'ύ',
283
+ 'ώ' => 'ώ',
284
+ 'ϓ' => 'ϓ',
285
+ 'ϔ' => 'ϔ',
286
+ 'Ѐ' => 'Ѐ',
287
+ 'Ё' => 'Ё',
288
+ 'Ѓ' => 'Ѓ',
289
+ 'Ї' => 'Ї',
290
+ 'Ќ' => 'Ќ',
291
+ 'Ѝ' => 'Ѝ',
292
+ 'Ў' => 'Ў',
293
+ 'Й' => 'Й',
294
+ 'й' => 'й',
295
+ 'ѐ' => 'ѐ',
296
+ 'ё' => 'ё',
297
+ 'ѓ' => 'ѓ',
298
+ 'ї' => 'ї',
299
+ 'ќ' => 'ќ',
300
+ 'ѝ' => 'ѝ',
301
+ 'ў' => 'ў',
302
+ 'Ѷ' => 'Ѷ',
303
+ 'ѷ' => 'ѷ',
304
+ 'Ӂ' => 'Ӂ',
305
+ 'ӂ' => 'ӂ',
306
+ 'Ӑ' => 'Ӑ',
307
+ 'ӑ' => 'ӑ',
308
+ 'Ӓ' => 'Ӓ',
309
+ 'ӓ' => 'ӓ',
310
+ 'Ӗ' => 'Ӗ',
311
+ 'ӗ' => 'ӗ',
312
+ 'Ӛ' => 'Ӛ',
313
+ 'ӛ' => 'ӛ',
314
+ 'Ӝ' => 'Ӝ',
315
+ 'ӝ' => 'ӝ',
316
+ 'Ӟ' => 'Ӟ',
317
+ 'ӟ' => 'ӟ',
318
+ 'Ӣ' => 'Ӣ',
319
+ 'ӣ' => 'ӣ',
320
+ 'Ӥ' => 'Ӥ',
321
+ 'ӥ' => 'ӥ',
322
+ 'Ӧ' => 'Ӧ',
323
+ 'ӧ' => 'ӧ',
324
+ 'Ӫ' => 'Ӫ',
325
+ 'ӫ' => 'ӫ',
326
+ 'Ӭ' => 'Ӭ',
327
+ 'ӭ' => 'ӭ',
328
+ 'Ӯ' => 'Ӯ',
329
+ 'ӯ' => 'ӯ',
330
+ 'Ӱ' => 'Ӱ',
331
+ 'ӱ' => 'ӱ',
332
+ 'Ӳ' => 'Ӳ',
333
+ 'ӳ' => 'ӳ',
334
+ 'Ӵ' => 'Ӵ',
335
+ 'ӵ' => 'ӵ',
336
+ 'Ӹ' => 'Ӹ',
337
+ 'ӹ' => 'ӹ',
338
+ 'آ' => 'آ',
339
+ 'أ' => 'أ',
340
+ 'ؤ' => 'ؤ',
341
+ 'إ' => 'إ',
342
+ 'ئ' => 'ئ',
343
+ 'ۀ' => 'ۀ',
344
+ 'ۂ' => 'ۂ',
345
+ 'ۓ' => 'ۓ',
346
+ 'ऩ' => 'ऩ',
347
+ 'ऱ' => 'ऱ',
348
+ 'ऴ' => 'ऴ',
349
+ 'क़' => 'क़',
350
+ 'ख़' => 'ख़',
351
+ 'ग़' => 'ग़',
352
+ 'ज़' => 'ज़',
353
+ 'ड़' => 'ड़',
354
+ 'ढ़' => 'ढ़',
355
+ 'फ़' => 'फ़',
356
+ 'य़' => 'य़',
357
+ 'ো' => 'ো',
358
+ 'ৌ' => 'ৌ',
359
+ 'ড়' => 'ড়',
360
+ 'ঢ়' => 'ঢ়',
361
+ 'য়' => 'য়',
362
+ 'ਲ਼' => 'ਲ਼',
363
+ 'ਸ਼' => 'ਸ਼',
364
+ 'ਖ਼' => 'ਖ਼',
365
+ 'ਗ਼' => 'ਗ਼',
366
+ 'ਜ਼' => 'ਜ਼',
367
+ 'ਫ਼' => 'ਫ਼',
368
+ 'ୈ' => 'ୈ',
369
+ 'ୋ' => 'ୋ',
370
+ 'ୌ' => 'ୌ',
371
+ 'ଡ଼' => 'ଡ଼',
372
+ 'ଢ଼' => 'ଢ଼',
373
+ 'ஔ' => 'ஔ',
374
+ 'ொ' => 'ொ',
375
+ 'ோ' => 'ோ',
376
+ 'ௌ' => 'ௌ',
377
+ 'ై' => 'ై',
378
+ 'ೀ' => 'ೀ',
379
+ 'ೇ' => 'ೇ',
380
+ 'ೈ' => 'ೈ',
381
+ 'ೊ' => 'ೊ',
382
+ 'ೋ' => 'ೋ',
383
+ 'ൊ' => 'ൊ',
384
+ 'ോ' => 'ോ',
385
+ 'ൌ' => 'ൌ',
386
+ 'ේ' => 'ේ',
387
+ 'ො' => 'ො',
388
+ 'ෝ' => 'ෝ',
389
+ 'ෞ' => 'ෞ',
390
+ 'གྷ' => 'གྷ',
391
+ 'ཌྷ' => 'ཌྷ',
392
+ 'དྷ' => 'དྷ',
393
+ 'བྷ' => 'བྷ',
394
+ 'ཛྷ' => 'ཛྷ',
395
+ 'ཀྵ' => 'ཀྵ',
396
+ 'ཱི' => 'ཱི',
397
+ 'ཱུ' => 'ཱུ',
398
+ 'ྲྀ' => 'ྲྀ',
399
+ 'ླྀ' => 'ླྀ',
400
+ 'ཱྀ' => 'ཱྀ',
401
+ 'ྒྷ' => 'ྒྷ',
402
+ 'ྜྷ' => 'ྜྷ',
403
+ 'ྡྷ' => 'ྡྷ',
404
+ 'ྦྷ' => 'ྦྷ',
405
+ 'ྫྷ' => 'ྫྷ',
406
+ 'ྐྵ' => 'ྐྵ',
407
+ 'ဦ' => 'ဦ',
408
+ 'ᬆ' => 'ᬆ',
409
+ 'ᬈ' => 'ᬈ',
410
+ 'ᬊ' => 'ᬊ',
411
+ 'ᬌ' => 'ᬌ',
412
+ 'ᬎ' => 'ᬎ',
413
+ 'ᬒ' => 'ᬒ',
414
+ 'ᬻ' => 'ᬻ',
415
+ 'ᬽ' => 'ᬽ',
416
+ 'ᭀ' => 'ᭀ',
417
+ 'ᭁ' => 'ᭁ',
418
+ 'ᭃ' => 'ᭃ',
419
+ 'Ḁ' => 'Ḁ',
420
+ 'ḁ' => 'ḁ',
421
+ 'Ḃ' => 'Ḃ',
422
+ 'ḃ' => 'ḃ',
423
+ 'Ḅ' => 'Ḅ',
424
+ 'ḅ' => 'ḅ',
425
+ 'Ḇ' => 'Ḇ',
426
+ 'ḇ' => 'ḇ',
427
+ 'Ḉ' => 'Ḉ',
428
+ 'ḉ' => 'ḉ',
429
+ 'Ḋ' => 'Ḋ',
430
+ 'ḋ' => 'ḋ',
431
+ 'Ḍ' => 'Ḍ',
432
+ 'ḍ' => 'ḍ',
433
+ 'Ḏ' => 'Ḏ',
434
+ 'ḏ' => 'ḏ',
435
+ 'Ḑ' => 'Ḑ',
436
+ 'ḑ' => 'ḑ',
437
+ 'Ḓ' => 'Ḓ',
438
+ 'ḓ' => 'ḓ',
439
+ 'Ḕ' => 'Ḕ',
440
+ 'ḕ' => 'ḕ',
441
+ 'Ḗ' => 'Ḗ',
442
+ 'ḗ' => 'ḗ',
443
+ 'Ḙ' => 'Ḙ',
444
+ 'ḙ' => 'ḙ',
445
+ 'Ḛ' => 'Ḛ',
446
+ 'ḛ' => 'ḛ',
447
+ 'Ḝ' => 'Ḝ',
448
+ 'ḝ' => 'ḝ',
449
+ 'Ḟ' => 'Ḟ',
450
+ 'ḟ' => 'ḟ',
451
+ 'Ḡ' => 'Ḡ',
452
+ 'ḡ' => 'ḡ',
453
+ 'Ḣ' => 'Ḣ',
454
+ 'ḣ' => 'ḣ',
455
+ 'Ḥ' => 'Ḥ',
456
+ 'ḥ' => 'ḥ',
457
+ 'Ḧ' => 'Ḧ',
458
+ 'ḧ' => 'ḧ',
459
+ 'Ḩ' => 'Ḩ',
460
+ 'ḩ' => 'ḩ',
461
+ 'Ḫ' => 'Ḫ',
462
+ 'ḫ' => 'ḫ',
463
+ 'Ḭ' => 'Ḭ',
464
+ 'ḭ' => 'ḭ',
465
+ 'Ḯ' => 'Ḯ',
466
+ 'ḯ' => 'ḯ',
467
+ 'Ḱ' => 'Ḱ',
468
+ 'ḱ' => 'ḱ',
469
+ 'Ḳ' => 'Ḳ',
470
+ 'ḳ' => 'ḳ',
471
+ 'Ḵ' => 'Ḵ',
472
+ 'ḵ' => 'ḵ',
473
+ 'Ḷ' => 'Ḷ',
474
+ 'ḷ' => 'ḷ',
475
+ 'Ḹ' => 'Ḹ',
476
+ 'ḹ' => 'ḹ',
477
+ 'Ḻ' => 'Ḻ',
478
+ 'ḻ' => 'ḻ',
479
+ 'Ḽ' => 'Ḽ',
480
+ 'ḽ' => 'ḽ',
481
+ 'Ḿ' => 'Ḿ',
482
+ 'ḿ' => 'ḿ',
483
+ 'Ṁ' => 'Ṁ',
484
+ 'ṁ' => 'ṁ',
485
+ 'Ṃ' => 'Ṃ',
486
+ 'ṃ' => 'ṃ',
487
+ 'Ṅ' => 'Ṅ',
488
+ 'ṅ' => 'ṅ',
489
+ 'Ṇ' => 'Ṇ',
490
+ 'ṇ' => 'ṇ',
491
+ 'Ṉ' => 'Ṉ',
492
+ 'ṉ' => 'ṉ',
493
+ 'Ṋ' => 'Ṋ',
494
+ 'ṋ' => 'ṋ',
495
+ 'Ṍ' => 'Ṍ',
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
+ 'Ẓ' => 'Ẓ',
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
+ 'ứ' => 'ứ',
648
+ 'Ừ' => 'Ừ',
649
+ 'ừ' => 'ừ',
650
+ 'Ử' => 'Ử',
651
+ 'ử' => 'ử',
652
+ 'Ữ' => 'Ữ',
653
+ 'ữ' => 'ữ',
654
+ 'Ự' => 'Ự',
655
+ 'ự' => 'ự',
656
+ 'Ỳ' => 'Ỳ',
657
+ 'ỳ' => 'ỳ',
658
+ 'Ỵ' => 'Ỵ',
659
+ 'ỵ' => 'ỵ',
660
+ 'Ỷ' => 'Ỷ',
661
+ 'ỷ' => 'ỷ',
662
+ 'Ỹ' => 'Ỹ',
663
+ 'ỹ' => 'ỹ',
664
+ 'ἀ' => 'ἀ',
665
+ 'ἁ' => 'ἁ',
666
+ 'ἂ' => 'ἂ',
667
+ 'ἃ' => 'ἃ',
668
+ 'ἄ' => 'ἄ',
669
+ 'ἅ' => 'ἅ',
670
+ 'ἆ' => 'ἆ',
671
+ 'ἇ' => 'ἇ',
672
+ 'Ἀ' => 'Ἀ',
673
+ 'Ἁ' => 'Ἁ',
674
+ 'Ἂ' => 'Ἂ',
675
+ 'Ἃ' => 'Ἃ',
676
+ 'Ἄ' => 'Ἄ',
677
+ 'Ἅ' => 'Ἅ',
678
+ 'Ἆ' => 'Ἆ',
679
+ 'Ἇ' => 'Ἇ',
680
+ 'ἐ' => 'ἐ',
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
+ 'Ἵ' => 'Ἵ',
722
+ 'Ἶ' => 'Ἶ',
723
+ 'Ἷ' => 'Ἷ',
724
+ 'ὀ' => 'ὀ',
725
+ 'ὁ' => 'ὁ',
726
+ 'ὂ' => 'ὂ',
727
+ 'ὃ' => 'ὃ',
728
+ 'ὄ' => 'ὄ',
729
+ 'ὅ' => 'ὅ',
730
+ 'Ὀ' => 'Ὀ',
731
+ 'Ὁ' => 'Ὁ',
732
+ 'Ὂ' => 'Ὂ',
733
+ 'Ὃ' => 'Ὃ',
734
+ 'Ὄ' => 'Ὄ',
735
+ 'Ὅ' => 'Ὅ',
736
+ 'ὐ' => 'ὐ',
737
+ 'ὑ' => 'ὑ',
738
+ 'ὒ' => 'ὒ',
739
+ 'ὓ' => 'ὓ',
740
+ 'ὔ' => 'ὔ',
741
+ 'ὕ' => 'ὕ',
742
+ 'ὖ' => 'ὖ',
743
+ 'ὗ' => 'ὗ',
744
+ 'Ὑ' => 'Ὑ',
745
+ 'Ὓ' => 'Ὓ',
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
+ 'ᾈ' => 'ᾈ',
787
+ 'ᾉ' => 'ᾉ',
788
+ 'ᾊ' => 'ᾊ',
789
+ 'ᾋ' => 'ᾋ',
790
+ 'ᾌ' => 'ᾌ',
791
+ 'ᾍ' => 'ᾍ',
792
+ 'ᾎ' => 'ᾎ',
793
+ 'ᾏ' => 'ᾏ',
794
+ 'ᾐ' => 'ᾐ',
795
+ 'ᾑ' => 'ᾑ',
796
+ 'ᾒ' => 'ᾒ',
797
+ 'ᾓ' => 'ᾓ',
798
+ 'ᾔ' => 'ᾔ',
799
+ 'ᾕ' => 'ᾕ',
800
+ 'ᾖ' => 'ᾖ',
801
+ 'ᾗ' => 'ᾗ',
802
+ 'ᾘ' => 'ᾘ',
803
+ 'ᾙ' => 'ᾙ',
804
+ 'ᾚ' => 'ᾚ',
805
+ 'ᾛ' => 'ᾛ',
806
+ 'ᾜ' => 'ᾜ',
807
+ 'ᾝ' => 'ᾝ',
808
+ 'ᾞ' => 'ᾞ',
809
+ 'ᾟ' => 'ᾟ',
810
+ 'ᾠ' => 'ᾠ',
811
+ 'ᾡ' => 'ᾡ',
812
+ 'ᾢ' => 'ᾢ',
813
+ 'ᾣ' => 'ᾣ',
814
+ 'ᾤ' => 'ᾤ',
815
+ 'ᾥ' => 'ᾥ',
816
+ 'ᾦ' => 'ᾦ',
817
+ 'ᾧ' => 'ᾧ',
818
+ 'ᾨ' => 'ᾨ',
819
+ 'ᾩ' => 'ᾩ',
820
+ 'ᾪ' => 'ᾪ',
821
+ 'ᾫ' => 'ᾫ',
822
+ 'ᾬ' => 'ᾬ',
823
+ 'ᾭ' => 'ᾭ',
824
+ 'ᾮ' => 'ᾮ',
825
+ 'ᾯ' => 'ᾯ',
826
+ 'ᾰ' => 'ᾰ',
827
+ 'ᾱ' => 'ᾱ',
828
+ 'ᾲ' => 'ᾲ',
829
+ 'ᾳ' => 'ᾳ',
830
+ 'ᾴ' => 'ᾴ',
831
+ 'ᾶ' => 'ᾶ',
832
+ 'ᾷ' => 'ᾷ',
833
+ 'Ᾰ' => 'Ᾰ',
834
+ 'Ᾱ' => 'Ᾱ',
835
+ 'Ὰ' => 'Ὰ',
836
+ 'Ά' => 'Ά',
837
+ 'ᾼ' => 'ᾼ',
838
+ 'ι' => 'ι',
839
+ '῁' => '῁',
840
+ 'ῂ' => 'ῂ',
841
+ 'ῃ' => 'ῃ',
842
+ 'ῄ' => 'ῄ',
843
+ 'ῆ' => 'ῆ',
844
+ 'ῇ' => 'ῇ',
845
+ 'Ὲ' => 'Ὲ',
846
+ 'Έ' => 'Έ',
847
+ 'Ὴ' => 'Ὴ',
848
+ 'Ή' => 'Ή',
849
+ 'ῌ' => 'ῌ',
850
+ '῍' => '῍',
851
+ '῎' => '῎',
852
+ '῏' => '῏',
853
+ 'ῐ' => 'ῐ',
854
+ 'ῑ' => 'ῑ',
855
+ 'ῒ' => 'ῒ',
856
+ 'ΐ' => 'ΐ',
857
+ 'ῖ' => 'ῖ',
858
+ 'ῗ' => 'ῗ',
859
+ 'Ῐ' => 'Ῐ',
860
+ 'Ῑ' => 'Ῑ',
861
+ 'Ὶ' => 'Ὶ',
862
+ 'Ί' => 'Ί',
863
+ '῝' => '῝',
864
+ '῞' => '῞',
865
+ '῟' => '῟',
866
+ 'ῠ' => 'ῠ',
867
+ 'ῡ' => 'ῡ',
868
+ 'ῢ' => 'ῢ',
869
+ 'ΰ' => 'ΰ',
870
+ 'ῤ' => 'ῤ',
871
+ 'ῥ' => 'ῥ',
872
+ 'ῦ' => 'ῦ',
873
+ 'ῧ' => 'ῧ',
874
+ 'Ῠ' => 'Ῠ',
875
+ 'Ῡ' => 'Ῡ',
876
+ 'Ὺ' => 'Ὺ',
877
+ 'Ύ' => 'Ύ',
878
+ 'Ῥ' => 'Ῥ',
879
+ '῭' => '῭',
880
+ '΅' => '΅',
881
+ '`' => '`',
882
+ 'ῲ' => 'ῲ',
883
+ 'ῳ' => 'ῳ',
884
+ 'ῴ' => 'ῴ',
885
+ 'ῶ' => 'ῶ',
886
+ 'ῷ' => 'ῷ',
887
+ 'Ὸ' => 'Ὸ',
888
+ 'Ό' => 'Ό',
889
+ 'Ὼ' => 'Ὼ',
890
+ 'Ώ' => 'Ώ',
891
+ 'ῼ' => 'ῼ',
892
+ '´' => '´',
893
+ ' ' => ' ',
894
+ ' ' => ' ',
895
+ 'Ω' => 'Ω',
896
+ 'K' => 'K',
897
+ 'Å' => 'Å',
898
+ '↚' => '↚',
899
+ '↛' => '↛',
900
+ '↮' => '↮',
901
+ '⇍' => '⇍',
902
+ '⇎' => '⇎',
903
+ '⇏' => '⇏',
904
+ '∄' => '∄',
905
+ '∉' => '∉',
906
+ '∌' => '∌',
907
+ '∤' => '∤',
908
+ '∦' => '∦',
909
+ '≁' => '≁',
910
+ '≄' => '≄',
911
+ '≇' => '≇',
912
+ '≉' => '≉',
913
+ '≠' => '≠',
914
+ '≢' => '≢',
915
+ '≭' => '≭',
916
+ '≮' => '≮',
917
+ '≯' => '≯',
918
+ '≰' => '≰',
919
+ '≱' => '≱',
920
+ '≴' => '≴',
921
+ '≵' => '≵',
922
+ '≸' => '≸',
923
+ '≹' => '≹',
924
+ '⊀' => '⊀',
925
+ '⊁' => '⊁',
926
+ '⊄' => '⊄',
927
+ '⊅' => '⊅',
928
+ '⊈' => '⊈',
929
+ '⊉' => '⊉',
930
+ '⊬' => '⊬',
931
+ '⊭' => '⊭',
932
+ '⊮' => '⊮',
933
+ '⊯' => '⊯',
934
+ '⋠' => '⋠',
935
+ '⋡' => '⋡',
936
+ '⋢' => '⋢',
937
+ '⋣' => '⋣',
938
+ '⋪' => '⋪',
939
+ '⋫' => '⋫',
940
+ '⋬' => '⋬',
941
+ '⋭' => '⋭',
942
+ '〈' => '〈',
943
+ '〉' => '〉',
944
+ '⫝̸' => '⫝̸',
945
+ 'が' => 'が',
946
+ 'ぎ' => 'ぎ',
947
+ 'ぐ' => 'ぐ',
948
+ 'げ' => 'げ',
949
+ 'ご' => 'ご',
950
+ 'ざ' => 'ざ',
951
+ 'じ' => 'じ',
952
+ 'ず' => 'ず',
953
+ 'ぜ' => 'ぜ',
954
+ 'ぞ' => 'ぞ',
955
+ 'だ' => 'だ',
956
+ 'ぢ' => 'ぢ',
957
+ 'づ' => 'づ',
958
+ 'で' => 'で',
959
+ 'ど' => 'ど',
960
+ 'ば' => 'ば',
961
+ 'ぱ' => 'ぱ',
962
+ 'び' => 'び',
963
+ 'ぴ' => 'ぴ',
964
+ 'ぶ' => 'ぶ',
965
+ 'ぷ' => 'ぷ',
966
+ 'べ' => 'べ',
967
+ 'ぺ' => 'ぺ',
968
+ 'ぼ' => 'ぼ',
969
+ 'ぽ' => 'ぽ',
970
+ 'ゔ' => 'ゔ',
971
+ 'ゞ' => 'ゞ',
972
+ 'ガ' => 'ガ',
973
+ 'ギ' => 'ギ',
974
+ 'グ' => 'グ',
975
+ 'ゲ' => 'ゲ',
976
+ 'ゴ' => 'ゴ',
977
+ 'ザ' => 'ザ',
978
+ 'ジ' => 'ジ',
979
+ 'ズ' => 'ズ',
980
+ 'ゼ' => 'ゼ',
981
+ 'ゾ' => 'ゾ',
982
+ 'ダ' => 'ダ',
983
+ 'ヂ' => 'ヂ',
984
+ 'ヅ' => 'ヅ',
985
+ 'デ' => 'デ',
986
+ 'ド' => 'ド',
987
+ 'バ' => 'バ',
988
+ 'パ' => 'パ',
989
+ 'ビ' => 'ビ',
990
+ 'ピ' => 'ピ',
991
+ 'ブ' => 'ブ',
992
+ 'プ' => 'プ',
993
+ 'ベ' => 'ベ',
994
+ 'ペ' => 'ペ',
995
+ 'ボ' => 'ボ',
996
+ 'ポ' => 'ポ',
997
+ 'ヴ' => 'ヴ',
998
+ 'ヷ' => 'ヷ',
999
+ 'ヸ' => 'ヸ',
1000
+ 'ヹ' => 'ヹ',
1001
+ 'ヺ' => 'ヺ',
1002
+ 'ヾ' => 'ヾ',
1003
+ '豈' => '豈',
1004
+ '更' => '更',
1005
+ '車' => '車',
1006
+ '賈' => '賈',
1007
+ '滑' => '滑',
1008
+ '串' => '串',
1009
+ '句' => '句',
1010
+ '龜' => '龜',
1011
+ '龜' => '龜',
1012
+ '契' => '契',
1013
+ '金' => '金',
1014
+ '喇' => '喇',
1015
+ '奈' => '奈',
1016
+ '懶' => '懶',
1017
+ '癩' => '癩',
1018
+ '羅' => '羅',
1019
+ '蘿' => '蘿',
1020
+ '螺' => '螺',
1021
+ '裸' => '裸',
1022
+ '邏' => '邏',
1023
+ '樂' => '樂',
1024
+ '洛' => '洛',
1025
+ '烙' => '烙',
1026
+ '珞' => '珞',
1027
+ '落' => '落',
1028
+ '酪' => '酪',
1029
+ '駱' => '駱',
1030
+ '亂' => '亂',
1031
+ '卵' => '卵',
1032
+ '欄' => '欄',
1033
+ '爛' => '爛',
1034
+ '蘭' => '蘭',
1035
+ '鸞' => '鸞',
1036
+ '嵐' => '嵐',
1037
+ '濫' => '濫',
1038
+ '藍' => '藍',
1039
+ '襤' => '襤',
1040
+ '拉' => '拉',
1041
+ '臘' => '臘',
1042
+ '蠟' => '蠟',
1043
+ '廊' => '廊',
1044
+ '朗' => '朗',
1045
+ '浪' => '浪',
1046
+ '狼' => '狼',
1047
+ '郎' => '郎',
1048
+ '來' => '來',
1049
+ '冷' => '冷',
1050
+ '勞' => '勞',
1051
+ '擄' => '擄',
1052
+ '櫓' => '櫓',
1053
+ '爐' => '爐',
1054
+ '盧' => '盧',
1055
+ '老' => '老',
1056
+ '蘆' => '蘆',
1057
+ '虜' => '虜',
1058
+ '路' => '路',
1059
+ '露' => '露',
1060
+ '魯' => '魯',
1061
+ '鷺' => '鷺',
1062
+ '碌' => '碌',
1063
+ '祿' => '祿',
1064
+ '綠' => '綠',
1065
+ '菉' => '菉',
1066
+ '錄' => '錄',
1067
+ '鹿' => '鹿',
1068
+ '論' => '論',
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
+ '裂' => '裂',
1164
+ '說' => '說',
1165
+ '廉' => '廉',
1166
+ '念' => '念',
1167
+ '捻' => '捻',
1168
+ '殮' => '殮',
1169
+ '簾' => '簾',
1170
+ '獵' => '獵',
1171
+ '令' => '令',
1172
+ '囹' => '囹',
1173
+ '寧' => '寧',
1174
+ '嶺' => '嶺',
1175
+ '怜' => '怜',
1176
+ '玲' => '玲',
1177
+ '瑩' => '瑩',
1178
+ '羚' => '羚',
1179
+ '聆' => '聆',
1180
+ '鈴' => '鈴',
1181
+ '零' => '零',
1182
+ '靈' => '靈',
1183
+ '領' => '領',
1184
+ '例' => '例',
1185
+ '禮' => '禮',
1186
+ '醴' => '醴',
1187
+ '隸' => '隸',
1188
+ '惡' => '惡',
1189
+ '了' => '了',
1190
+ '僚' => '僚',
1191
+ '寮' => '寮',
1192
+ '尿' => '尿',
1193
+ '料' => '料',
1194
+ '樂' => '樂',
1195
+ '燎' => '燎',
1196
+ '療' => '療',
1197
+ '蓼' => '蓼',
1198
+ '遼' => '遼',
1199
+ '龍' => '龍',
1200
+ '暈' => '暈',
1201
+ '阮' => '阮',
1202
+ '劉' => '劉',
1203
+ '杻' => '杻',
1204
+ '柳' => '柳',
1205
+ '流' => '流',
1206
+ '溜' => '溜',
1207
+ '琉' => '琉',
1208
+ '留' => '留',
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
+ '喝' => '喝',
1302
+ '嘆' => '嘆',
1303
+ '器' => '器',
1304
+ '塀' => '塀',
1305
+ '墨' => '墨',
1306
+ '層' => '層',
1307
+ '屮' => '屮',
1308
+ '悔' => '悔',
1309
+ '慨' => '慨',
1310
+ '憎' => '憎',
1311
+ '懲' => '懲',
1312
+ '敏' => '敏',
1313
+ '既' => '既',
1314
+ '暑' => '暑',
1315
+ '梅' => '梅',
1316
+ '海' => '海',
1317
+ '渚' => '渚',
1318
+ '漢' => '漢',
1319
+ '煮' => '煮',
1320
+ '爫' => '爫',
1321
+ '琢' => '琢',
1322
+ '碑' => '碑',
1323
+ '社' => '社',
1324
+ '祉' => '祉',
1325
+ '祈' => '祈',
1326
+ '祐' => '祐',
1327
+ '祖' => '祖',
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
+ '滛' => '滛',
1398
+ '滋' => '滋',
1399
+ '漢' => '漢',
1400
+ '瀞' => '瀞',
1401
+ '煮' => '煮',
1402
+ '瞧' => '瞧',
1403
+ '爵' => '爵',
1404
+ '犯' => '犯',
1405
+ '猪' => '猪',
1406
+ '瑱' => '瑱',
1407
+ '甆' => '甆',
1408
+ '画' => '画',
1409
+ '瘝' => '瘝',
1410
+ '瘟' => '瘟',
1411
+ '益' => '益',
1412
+ '盛' => '盛',
1413
+ '直' => '直',
1414
+ '睊' => '睊',
1415
+ '着' => '着',
1416
+ '磌' => '磌',
1417
+ '窱' => '窱',
1418
+ '節' => '節',
1419
+ '类' => '类',
1420
+ '絛' => '絛',
1421
+ '練' => '練',
1422
+ '缾' => '缾',
1423
+ '者' => '者',
1424
+ '荒' => '荒',
1425
+ '華' => '華',
1426
+ '蝹' => '蝹',
1427
+ '襁' => '襁',
1428
+ '覆' => '覆',
1429
+ '視' => '視',
1430
+ '調' => '調',
1431
+ '諸' => '諸',
1432
+ '請' => '請',
1433
+ '謁' => '謁',
1434
+ '諾' => '諾',
1435
+ '諭' => '諭',
1436
+ '謹' => '謹',
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
+ 'קּ' => 'קּ',
1490
+ 'רּ' => 'רּ',
1491
+ 'שּ' => 'שּ',
1492
+ 'תּ' => 'תּ',
1493
+ 'וֹ' => 'וֹ',
1494
+ 'בֿ' => 'בֿ',
1495
+ 'כֿ' => 'כֿ',
1496
+ 'פֿ' => 'פֿ',
1497
+ '𑂚' => '𑂚',
1498
+ '𑂜' => '𑂜',
1499
+ '𑂫' => '𑂫',
1500
+ '𑄮' => '𑄮',
1501
+ '𑄯' => '𑄯',
1502
+ '𑍋' => '𑍋',
1503
+ '𑍌' => '𑍌',
1504
+ '𑒻' => '𑒻',
1505
+ '𑒼' => '𑒼',
1506
+ '𑒾' => '𑒾',
1507
+ '𑖺' => '𑖺',
1508
+ '𑖻' => '𑖻',
1509
+ '𑤸' => '𑤸',
1510
+ '𝅗𝅥' => '𝅗𝅥',
1511
+ '𝅘𝅥' => '𝅘𝅥',
1512
+ '𝅘𝅥𝅮' => '𝅘𝅥𝅮',
1513
+ '𝅘𝅥𝅯' => '𝅘𝅥𝅯',
1514
+ '𝅘𝅥𝅰' => '𝅘𝅥𝅰',
1515
+ '𝅘𝅥𝅱' => '𝅘𝅥𝅱',
1516
+ '𝅘𝅥𝅲' => '𝅘𝅥𝅲',
1517
+ '𝆹𝅥' => '𝆹𝅥',
1518
+ '𝆺𝅥' => '𝆺𝅥',
1519
+ '𝆹𝅥𝅮' => '𝆹𝅥𝅮',
1520
+ '𝆺𝅥𝅮' => '𝆺𝅥𝅮',
1521
+ '𝆹𝅥𝅯' => '𝆹𝅥𝅯',
1522
+ '𝆺𝅥𝅯' => '𝆺𝅥𝅯',
1523
+ '丽' => '丽',
1524
+ '丸' => '丸',
1525
+ '乁' => '乁',
1526
+ '𠄢' => '𠄢',
1527
+ '你' => '你',
1528
+ '侮' => '侮',
1529
+ '侻' => '侻',
1530
+ '倂' => '倂',
1531
+ '偺' => '偺',
1532
+ '備' => '備',
1533
+ '僧' => '僧',
1534
+ '像' => '像',
1535
+ '㒞' => '㒞',
1536
+ '𠘺' => '𠘺',
1537
+ '免' => '免',
1538
+ '兔' => '兔',
1539
+ '兤' => '兤',
1540
+ '具' => '具',
1541
+ '𠔜' => '𠔜',
1542
+ '㒹' => '㒹',
1543
+ '內' => '內',
1544
+ '再' => '再',
1545
+ '𠕋' => '𠕋',
1546
+ '冗' => '冗',
1547
+ '冤' => '冤',
1548
+ '仌' => '仌',
1549
+ '冬' => '冬',
1550
+ '况' => '况',
1551
+ '𩇟' => '𩇟',
1552
+ '凵' => '凵',
1553
+ '刃' => '刃',
1554
+ '㓟' => '㓟',
1555
+ '刻' => '刻',
1556
+ '剆' => '剆',
1557
+ '割' => '割',
1558
+ '剷' => '剷',
1559
+ '㔕' => '㔕',
1560
+ '勇' => '勇',
1561
+ '勉' => '勉',
1562
+ '勤' => '勤',
1563
+ '勺' => '勺',
1564
+ '包' => '包',
1565
+ '匆' => '匆',
1566
+ '北' => '北',
1567
+ '卉' => '卉',
1568
+ '卑' => '卑',
1569
+ '博' => '博',
1570
+ '即' => '即',
1571
+ '卽' => '卽',
1572
+ '卿' => '卿',
1573
+ '卿' => '卿',
1574
+ '卿' => '卿',
1575
+ '𠨬' => '𠨬',
1576
+ '灰' => '灰',
1577
+ '及' => '及',
1578
+ '叟' => '叟',
1579
+ '𠭣' => '𠭣',
1580
+ '叫' => '叫',
1581
+ '叱' => '叱',
1582
+ '吆' => '吆',
1583
+ '咞' => '咞',
1584
+ '吸' => '吸',
1585
+ '呈' => '呈',
1586
+ '周' => '周',
1587
+ '咢' => '咢',
1588
+ '哶' => '哶',
1589
+ '唐' => '唐',
1590
+ '啓' => '啓',
1591
+ '啣' => '啣',
1592
+ '善' => '善',
1593
+ '善' => '善',
1594
+ '喙' => '喙',
1595
+ '喫' => '喫',
1596
+ '喳' => '喳',
1597
+ '嗂' => '嗂',
1598
+ '圖' => '圖',
1599
+ '嘆' => '嘆',
1600
+ '圗' => '圗',
1601
+ '噑' => '噑',
1602
+ '噴' => '噴',
1603
+ '切' => '切',
1604
+ '壮' => '壮',
1605
+ '城' => '城',
1606
+ '埴' => '埴',
1607
+ '堍' => '堍',
1608
+ '型' => '型',
1609
+ '堲' => '堲',
1610
+ '報' => '報',
1611
+ '墬' => '墬',
1612
+ '𡓤' => '𡓤',
1613
+ '売' => '売',
1614
+ '壷' => '壷',
1615
+ '夆' => '夆',
1616
+ '多' => '多',
1617
+ '夢' => '夢',
1618
+ '奢' => '奢',
1619
+ '𡚨' => '𡚨',
1620
+ '𡛪' => '𡛪',
1621
+ '姬' => '姬',
1622
+ '娛' => '娛',
1623
+ '娧' => '娧',
1624
+ '姘' => '姘',
1625
+ '婦' => '婦',
1626
+ '㛮' => '㛮',
1627
+ '㛼' => '㛼',
1628
+ '嬈' => '嬈',
1629
+ '嬾' => '嬾',
1630
+ '嬾' => '嬾',
1631
+ '𡧈' => '𡧈',
1632
+ '寃' => '寃',
1633
+ '寘' => '寘',
1634
+ '寧' => '寧',
1635
+ '寳' => '寳',
1636
+ '𡬘' => '𡬘',
1637
+ '寿' => '寿',
1638
+ '将' => '将',
1639
+ '当' => '当',
1640
+ '尢' => '尢',
1641
+ '㞁' => '㞁',
1642
+ '屠' => '屠',
1643
+ '屮' => '屮',
1644
+ '峀' => '峀',
1645
+ '岍' => '岍',
1646
+ '𡷤' => '𡷤',
1647
+ '嵃' => '嵃',
1648
+ '𡷦' => '𡷦',
1649
+ '嵮' => '嵮',
1650
+ '嵫' => '嵫',
1651
+ '嵼' => '嵼',
1652
+ '巡' => '巡',
1653
+ '巢' => '巢',
1654
+ '㠯' => '㠯',
1655
+ '巽' => '巽',
1656
+ '帨' => '帨',
1657
+ '帽' => '帽',
1658
+ '幩' => '幩',
1659
+ '㡢' => '㡢',
1660
+ '𢆃' => '𢆃',
1661
+ '㡼' => '㡼',
1662
+ '庰' => '庰',
1663
+ '庳' => '庳',
1664
+ '庶' => '庶',
1665
+ '廊' => '廊',
1666
+ '𪎒' => '𪎒',
1667
+ '廾' => '廾',
1668
+ '𢌱' => '𢌱',
1669
+ '𢌱' => '𢌱',
1670
+ '舁' => '舁',
1671
+ '弢' => '弢',
1672
+ '弢' => '弢',
1673
+ '㣇' => '㣇',
1674
+ '𣊸' => '𣊸',
1675
+ '𦇚' => '𦇚',
1676
+ '形' => '形',
1677
+ '彫' => '彫',
1678
+ '㣣' => '㣣',
1679
+ '徚' => '徚',
1680
+ '忍' => '忍',
1681
+ '志' => '志',
1682
+ '忹' => '忹',
1683
+ '悁' => '悁',
1684
+ '㤺' => '㤺',
1685
+ '㤜' => '㤜',
1686
+ '悔' => '悔',
1687
+ '𢛔' => '𢛔',
1688
+ '惇' => '惇',
1689
+ '慈' => '慈',
1690
+ '慌' => '慌',
1691
+ '慎' => '慎',
1692
+ '慌' => '慌',
1693
+ '慺' => '慺',
1694
+ '憎' => '憎',
1695
+ '憲' => '憲',
1696
+ '憤' => '憤',
1697
+ '憯' => '憯',
1698
+ '懞' => '懞',
1699
+ '懲' => '懲',
1700
+ '懶' => '懶',
1701
+ '成' => '成',
1702
+ '戛' => '戛',
1703
+ '扝' => '扝',
1704
+ '抱' => '抱',
1705
+ '拔' => '拔',
1706
+ '捐' => '捐',
1707
+ '𢬌' => '𢬌',
1708
+ '挽' => '挽',
1709
+ '拼' => '拼',
1710
+ '捨' => '捨',
1711
+ '掃' => '掃',
1712
+ '揤' => '揤',
1713
+ '𢯱' => '𢯱',
1714
+ '搢' => '搢',
1715
+ '揅' => '揅',
1716
+ '掩' => '掩',
1717
+ '㨮' => '㨮',
1718
+ '摩' => '摩',
1719
+ '摾' => '摾',
1720
+ '撝' => '撝',
1721
+ '摷' => '摷',
1722
+ '㩬' => '㩬',
1723
+ '敏' => '敏',
1724
+ '敬' => '敬',
1725
+ '𣀊' => '𣀊',
1726
+ '旣' => '旣',
1727
+ '書' => '書',
1728
+ '晉' => '晉',
1729
+ '㬙' => '㬙',
1730
+ '暑' => '暑',
1731
+ '㬈' => '㬈',
1732
+ '㫤' => '㫤',
1733
+ '冒' => '冒',
1734
+ '冕' => '冕',
1735
+ '最' => '最',
1736
+ '暜' => '暜',
1737
+ '肭' => '肭',
1738
+ '䏙' => '䏙',
1739
+ '朗' => '朗',
1740
+ '望' => '望',
1741
+ '朡' => '朡',
1742
+ '杞' => '杞',
1743
+ '杓' => '杓',
1744
+ '𣏃' => '𣏃',
1745
+ '㭉' => '㭉',
1746
+ '柺' => '柺',
1747
+ '枅' => '枅',
1748
+ '桒' => '桒',
1749
+ '梅' => '梅',
1750
+ '𣑭' => '𣑭',
1751
+ '梎' => '梎',
1752
+ '栟' => '栟',
1753
+ '椔' => '椔',
1754
+ '㮝' => '㮝',
1755
+ '楂' => '楂',
1756
+ '榣' => '榣',
1757
+ '槪' => '槪',
1758
+ '檨' => '檨',
1759
+ '𣚣' => '𣚣',
1760
+ '櫛' => '櫛',
1761
+ '㰘' => '㰘',
1762
+ '次' => '次',
1763
+ '𣢧' => '𣢧',
1764
+ '歔' => '歔',
1765
+ '㱎' => '㱎',
1766
+ '歲' => '歲',
1767
+ '殟' => '殟',
1768
+ '殺' => '殺',
1769
+ '殻' => '殻',
1770
+ '𣪍' => '𣪍',
1771
+ '𡴋' => '𡴋',
1772
+ '𣫺' => '𣫺',
1773
+ '汎' => '汎',
1774
+ '𣲼' => '𣲼',
1775
+ '沿' => '沿',
1776
+ '泍' => '泍',
1777
+ '汧' => '汧',
1778
+ '洖' => '洖',
1779
+ '派' => '派',
1780
+ '海' => '海',
1781
+ '流' => '流',
1782
+ '浩' => '浩',
1783
+ '浸' => '浸',
1784
+ '涅' => '涅',
1785
+ '𣴞' => '𣴞',
1786
+ '洴' => '洴',
1787
+ '港' => '港',
1788
+ '湮' => '湮',
1789
+ '㴳' => '㴳',
1790
+ '滋' => '滋',
1791
+ '滇' => '滇',
1792
+ '𣻑' => '𣻑',
1793
+ '淹' => '淹',
1794
+ '潮' => '潮',
1795
+ '𣽞' => '𣽞',
1796
+ '𣾎' => '𣾎',
1797
+ '濆' => '濆',
1798
+ '瀹' => '瀹',
1799
+ '瀞' => '瀞',
1800
+ '瀛' => '瀛',
1801
+ '㶖' => '㶖',
1802
+ '灊' => '灊',
1803
+ '災' => '災',
1804
+ '灷' => '灷',
1805
+ '炭' => '炭',
1806
+ '𠔥' => '𠔥',
1807
+ '煅' => '煅',
1808
+ '𤉣' => '𤉣',
1809
+ '熜' => '熜',
1810
+ '𤎫' => '𤎫',
1811
+ '爨' => '爨',
1812
+ '爵' => '爵',
1813
+ '牐' => '牐',
1814
+ '𤘈' => '𤘈',
1815
+ '犀' => '犀',
1816
+ '犕' => '犕',
1817
+ '𤜵' => '𤜵',
1818
+ '𤠔' => '𤠔',
1819
+ '獺' => '獺',
1820
+ '王' => '王',
1821
+ '㺬' => '㺬',
1822
+ '玥' => '玥',
1823
+ '㺸' => '㺸',
1824
+ '㺸' => '㺸',
1825
+ '瑇' => '瑇',
1826
+ '瑜' => '瑜',
1827
+ '瑱' => '瑱',
1828
+ '璅' => '璅',
1829
+ '瓊' => '瓊',
1830
+ '㼛' => '㼛',
1831
+ '甤' => '甤',
1832
+ '𤰶' => '𤰶',
1833
+ '甾' => '甾',
1834
+ '𤲒' => '𤲒',
1835
+ '異' => '異',
1836
+ '𢆟' => '𢆟',
1837
+ '瘐' => '瘐',
1838
+ '𤾡' => '𤾡',
1839
+ '𤾸' => '𤾸',
1840
+ '𥁄' => '𥁄',
1841
+ '㿼' => '㿼',
1842
+ '䀈' => '䀈',
1843
+ '直' => '直',
1844
+ '𥃳' => '𥃳',
1845
+ '𥃲' => '𥃲',
1846
+ '𥄙' => '𥄙',
1847
+ '𥄳' => '𥄳',
1848
+ '眞' => '眞',
1849
+ '真' => '真',
1850
+ '真' => '真',
1851
+ '睊' => '睊',
1852
+ '䀹' => '䀹',
1853
+ '瞋' => '瞋',
1854
+ '䁆' => '䁆',
1855
+ '䂖' => '䂖',
1856
+ '𥐝' => '𥐝',
1857
+ '硎' => '硎',
1858
+ '碌' => '碌',
1859
+ '磌' => '磌',
1860
+ '䃣' => '䃣',
1861
+ '𥘦' => '𥘦',
1862
+ '祖' => '祖',
1863
+ '𥚚' => '𥚚',
1864
+ '𥛅' => '𥛅',
1865
+ '福' => '福',
1866
+ '秫' => '秫',
1867
+ '䄯' => '䄯',
1868
+ '穀' => '穀',
1869
+ '穊' => '穊',
1870
+ '穏' => '穏',
1871
+ '𥥼' => '𥥼',
1872
+ '𥪧' => '𥪧',
1873
+ '𥪧' => '𥪧',
1874
+ '竮' => '竮',
1875
+ '䈂' => '䈂',
1876
+ '𥮫' => '𥮫',
1877
+ '篆' => '篆',
1878
+ '築' => '築',
1879
+ '䈧' => '䈧',
1880
+ '𥲀' => '𥲀',
1881
+ '糒' => '糒',
1882
+ '䊠' => '䊠',
1883
+ '糨' => '糨',
1884
+ '糣' => '糣',
1885
+ '紀' => '紀',
1886
+ '𥾆' => '𥾆',
1887
+ '絣' => '絣',
1888
+ '䌁' => '䌁',
1889
+ '緇' => '緇',
1890
+ '縂' => '縂',
1891
+ '繅' => '繅',
1892
+ '䌴' => '䌴',
1893
+ '𦈨' => '𦈨',
1894
+ '𦉇' => '𦉇',
1895
+ '䍙' => '䍙',
1896
+ '𦋙' => '𦋙',
1897
+ '罺' => '罺',
1898
+ '𦌾' => '𦌾',
1899
+ '羕' => '羕',
1900
+ '翺' => '翺',
1901
+ '者' => '者',
1902
+ '𦓚' => '𦓚',
1903
+ '𦔣' => '𦔣',
1904
+ '聠' => '聠',
1905
+ '𦖨' => '𦖨',
1906
+ '聰' => '聰',
1907
+ '𣍟' => '𣍟',
1908
+ '䏕' => '䏕',
1909
+ '育' => '育',
1910
+ '脃' => '脃',
1911
+ '䐋' => '䐋',
1912
+ '脾' => '脾',
1913
+ '媵' => '媵',
1914
+ '𦞧' => '𦞧',
1915
+ '𦞵' => '𦞵',
1916
+ '𣎓' => '𣎓',
1917
+ '𣎜' => '𣎜',
1918
+ '舁' => '舁',
1919
+ '舄' => '舄',
1920
+ '辞' => '辞',
1921
+ '䑫' => '䑫',
1922
+ '芑' => '芑',
1923
+ '芋' => '芋',
1924
+ '芝' => '芝',
1925
+ '劳' => '劳',
1926
+ '花' => '花',
1927
+ '芳' => '芳',
1928
+ '芽' => '芽',
1929
+ '苦' => '苦',
1930
+ '𦬼' => '𦬼',
1931
+ '若' => '若',
1932
+ '茝' => '茝',
1933
+ '荣' => '荣',
1934
+ '莭' => '莭',
1935
+ '茣' => '茣',
1936
+ '莽' => '莽',
1937
+ '菧' => '菧',
1938
+ '著' => '著',
1939
+ '荓' => '荓',
1940
+ '菊' => '菊',
1941
+ '菌' => '菌',
1942
+ '菜' => '菜',
1943
+ '𦰶' => '𦰶',
1944
+ '𦵫' => '𦵫',
1945
+ '𦳕' => '𦳕',
1946
+ '䔫' => '䔫',
1947
+ '蓱' => '蓱',
1948
+ '蓳' => '蓳',
1949
+ '蔖' => '蔖',
1950
+ '𧏊' => '𧏊',
1951
+ '蕤' => '蕤',
1952
+ '𦼬' => '𦼬',
1953
+ '䕝' => '䕝',
1954
+ '䕡' => '䕡',
1955
+ '𦾱' => '𦾱',
1956
+ '𧃒' => '𧃒',
1957
+ '䕫' => '䕫',
1958
+ '虐' => '虐',
1959
+ '虜' => '虜',
1960
+ '虧' => '虧',
1961
+ '虩' => '虩',
1962
+ '蚩' => '蚩',
1963
+ '蚈' => '蚈',
1964
+ '蜎' => '蜎',
1965
+ '蛢' => '蛢',
1966
+ '蝹' => '蝹',
1967
+ '蜨' => '蜨',
1968
+ '蝫' => '蝫',
1969
+ '螆' => '螆',
1970
+ '䗗' => '䗗',
1971
+ '蟡' => '蟡',
1972
+ '蠁' => '蠁',
1973
+ '䗹' => '䗹',
1974
+ '衠' => '衠',
1975
+ '衣' => '衣',
1976
+ '𧙧' => '𧙧',
1977
+ '裗' => '裗',
1978
+ '裞' => '裞',
1979
+ '䘵' => '䘵',
1980
+ '裺' => '裺',
1981
+ '㒻' => '㒻',
1982
+ '𧢮' => '𧢮',
1983
+ '𧥦' => '𧥦',
1984
+ '䚾' => '䚾',
1985
+ '䛇' => '䛇',
1986
+ '誠' => '誠',
1987
+ '諭' => '諭',
1988
+ '變' => '變',
1989
+ '豕' => '豕',
1990
+ '𧲨' => '𧲨',
1991
+ '貫' => '貫',
1992
+ '賁' => '賁',
1993
+ '贛' => '贛',
1994
+ '起' => '起',
1995
+ '𧼯' => '𧼯',
1996
+ '𠠄' => '𠠄',
1997
+ '跋' => '跋',
1998
+ '趼' => '趼',
1999
+ '跰' => '跰',
2000
+ '𠣞' => '𠣞',
2001
+ '軔' => '軔',
2002
+ '輸' => '輸',
2003
+ '𨗒' => '𨗒',
2004
+ '𨗭' => '𨗭',
2005
+ '邔' => '邔',
2006
+ '郱' => '郱',
2007
+ '鄑' => '鄑',
2008
+ '𨜮' => '𨜮',
2009
+ '鄛' => '鄛',
2010
+ '鈸' => '鈸',
2011
+ '鋗' => '鋗',
2012
+ '鋘' => '鋘',
2013
+ '鉼' => '鉼',
2014
+ '鏹' => '鏹',
2015
+ '鐕' => '鐕',
2016
+ '𨯺' => '𨯺',
2017
+ '開' => '開',
2018
+ '䦕' => '䦕',
2019
+ '閷' => '閷',
2020
+ '𨵷' => '𨵷',
2021
+ '䧦' => '䧦',
2022
+ '雃' => '雃',
2023
+ '嶲' => '嶲',
2024
+ '霣' => '霣',
2025
+ '𩅅' => '𩅅',
2026
+ '𩈚' => '𩈚',
2027
+ '䩮' => '䩮',
2028
+ '䩶' => '䩶',
2029
+ '韠' => '韠',
2030
+ '𩐊' => '𩐊',
2031
+ '䪲' => '䪲',
2032
+ '𩒖' => '𩒖',
2033
+ '頋' => '頋',
2034
+ '頋' => '頋',
2035
+ '頩' => '頩',
2036
+ '𩖶' => '𩖶',
2037
+ '飢' => '飢',
2038
+ '䬳' => '䬳',
2039
+ '餩' => '餩',
2040
+ '馧' => '馧',
2041
+ '駂' => '駂',
2042
+ '駾' => '駾',
2043
+ '䯎' => '䯎',
2044
+ '𩬰' => '𩬰',
2045
+ '鬒' => '鬒',
2046
+ '鱀' => '鱀',
2047
+ '鳽' => '鳽',
2048
+ '䳎' => '䳎',
2049
+ '䳭' => '䳭',
2050
+ '鵧' => '鵧',
2051
+ '𪃎' => '𪃎',
2052
+ '䳸' => '䳸',
2053
+ '𪄅' => '𪄅',
2054
+ '𪈎' => '𪈎',
2055
+ '𪊑' => '𪊑',
2056
+ '麻' => '麻',
2057
+ '䵖' => '䵖',
2058
+ '黹' => '黹',
2059
+ '黾' => '黾',
2060
+ '鼅' => '鼅',
2061
+ '鼏' => '鼏',
2062
+ '鼖' => '鼖',
2063
+ '鼻' => '鼻',
2064
+ '𪘀' => '𪘀',
2065
+ );
vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php ADDED
@@ -0,0 +1,876 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ '̀' => 230,
5
+ '́' => 230,
6
+ '̂' => 230,
7
+ '̃' => 230,
8
+ '̄' => 230,
9
+ '̅' => 230,
10
+ '̆' => 230,
11
+ '̇' => 230,
12
+ '̈' => 230,
13
+ '̉' => 230,
14
+ '̊' => 230,
15
+ '̋' => 230,
16
+ '̌' => 230,
17
+ '̍' => 230,
18
+ '̎' => 230,
19
+ '̏' => 230,
20
+ '̐' => 230,
21
+ '̑' => 230,
22
+ '̒' => 230,
23
+ '̓' => 230,
24
+ '̔' => 230,
25
+ '̕' => 232,
26
+ '̖' => 220,
27
+ '̗' => 220,
28
+ '̘' => 220,
29
+ '̙' => 220,
30
+ '̚' => 232,
31
+ '̛' => 216,
32
+ '̜' => 220,
33
+ '̝' => 220,
34
+ '̞' => 220,
35
+ '̟' => 220,
36
+ '̠' => 220,
37
+ '̡' => 202,
38
+ '̢' => 202,
39
+ '̣' => 220,
40
+ '̤' => 220,
41
+ '̥' => 220,
42
+ '̦' => 220,
43
+ '̧' => 202,
44
+ '̨' => 202,
45
+ '̩' => 220,
46
+ '̪' => 220,
47
+ '̫' => 220,
48
+ '̬' => 220,
49
+ '̭' => 220,
50
+ '̮' => 220,
51
+ '̯' => 220,
52
+ '̰' => 220,
53
+ '̱' => 220,
54
+ '̲' => 220,
55
+ '̳' => 220,
56
+ '̴' => 1,
57
+ '̵' => 1,
58
+ '̶' => 1,
59
+ '̷' => 1,
60
+ '̸' => 1,
61
+ '̹' => 220,
62
+ '̺' => 220,
63
+ '̻' => 220,
64
+ '̼' => 220,
65
+ '̽' => 230,
66
+ '̾' => 230,
67
+ '̿' => 230,
68
+ '̀' => 230,
69
+ '́' => 230,
70
+ '͂' => 230,
71
+ '̓' => 230,
72
+ '̈́' => 230,
73
+ 'ͅ' => 240,
74
+ '͆' => 230,
75
+ '͇' => 220,
76
+ '͈' => 220,
77
+ '͉' => 220,
78
+ '͊' => 230,
79
+ '͋' => 230,
80
+ '͌' => 230,
81
+ '͍' => 220,
82
+ '͎' => 220,
83
+ '͐' => 230,
84
+ '͑' => 230,
85
+ '͒' => 230,
86
+ '͓' => 220,
87
+ '͔' => 220,
88
+ '͕' => 220,
89
+ '͖' => 220,
90
+ '͗' => 230,
91
+ '͘' => 232,
92
+ '͙' => 220,
93
+ '͚' => 220,
94
+ '͛' => 230,
95
+ '͜' => 233,
96
+ '͝' => 234,
97
+ '͞' => 234,
98
+ '͟' => 233,
99
+ '͠' => 234,
100
+ '͡' => 234,
101
+ '͢' => 233,
102
+ 'ͣ' => 230,
103
+ 'ͤ' => 230,
104
+ 'ͥ' => 230,
105
+ 'ͦ' => 230,
106
+ 'ͧ' => 230,
107
+ 'ͨ' => 230,
108
+ 'ͩ' => 230,
109
+ 'ͪ' => 230,
110
+ 'ͫ' => 230,
111
+ 'ͬ' => 230,
112
+ 'ͭ' => 230,
113
+ 'ͮ' => 230,
114
+ 'ͯ' => 230,
115
+ '҃' => 230,
116
+ '҄' => 230,
117
+ '҅' => 230,
118
+ '҆' => 230,
119
+ '҇' => 230,
120
+ '֑' => 220,
121
+ '֒' => 230,
122
+ '֓' => 230,
123
+ '֔' => 230,
124
+ '֕' => 230,
125
+ '֖' => 220,
126
+ '֗' => 230,
127
+ '֘' => 230,
128
+ '֙' => 230,
129
+ '֚' => 222,
130
+ '֛' => 220,
131
+ '֜' => 230,
132
+ '֝' => 230,
133
+ '֞' => 230,
134
+ '֟' => 230,
135
+ '֠' => 230,
136
+ '֡' => 230,
137
+ '֢' => 220,
138
+ '֣' => 220,
139
+ '֤' => 220,
140
+ '֥' => 220,
141
+ '֦' => 220,
142
+ '֧' => 220,
143
+ '֨' => 230,
144
+ '֩' => 230,
145
+ '֪' => 220,
146
+ '֫' => 230,
147
+ '֬' => 230,
148
+ '֭' => 222,
149
+ '֮' => 228,
150
+ '֯' => 230,
151
+ 'ְ' => 10,
152
+ 'ֱ' => 11,
153
+ 'ֲ' => 12,
154
+ 'ֳ' => 13,
155
+ 'ִ' => 14,
156
+ 'ֵ' => 15,
157
+ 'ֶ' => 16,
158
+ 'ַ' => 17,
159
+ 'ָ' => 18,
160
+ 'ֹ' => 19,
161
+ 'ֺ' => 19,
162
+ 'ֻ' => 20,
163
+ 'ּ' => 21,
164
+ 'ֽ' => 22,
165
+ 'ֿ' => 23,
166
+ 'ׁ' => 24,
167
+ 'ׂ' => 25,
168
+ 'ׄ' => 230,
169
+ 'ׅ' => 220,
170
+ 'ׇ' => 18,
171
+ 'ؐ' => 230,
172
+ 'ؑ' => 230,
173
+ 'ؒ' => 230,
174
+ 'ؓ' => 230,
175
+ 'ؔ' => 230,
176
+ 'ؕ' => 230,
177
+ 'ؖ' => 230,
178
+ 'ؗ' => 230,
179
+ 'ؘ' => 30,
180
+ 'ؙ' => 31,
181
+ 'ؚ' => 32,
182
+ 'ً' => 27,
183
+ 'ٌ' => 28,
184
+ 'ٍ' => 29,
185
+ 'َ' => 30,
186
+ 'ُ' => 31,
187
+ 'ِ' => 32,
188
+ 'ّ' => 33,
189
+ 'ْ' => 34,
190
+ 'ٓ' => 230,
191
+ 'ٔ' => 230,
192
+ 'ٕ' => 220,
193
+ 'ٖ' => 220,
194
+ 'ٗ' => 230,
195
+ '٘' => 230,
196
+ 'ٙ' => 230,
197
+ 'ٚ' => 230,
198
+ 'ٛ' => 230,
199
+ 'ٜ' => 220,
200
+ 'ٝ' => 230,
201
+ 'ٞ' => 230,
202
+ 'ٟ' => 220,
203
+ 'ٰ' => 35,
204
+ 'ۖ' => 230,
205
+ 'ۗ' => 230,
206
+ 'ۘ' => 230,
207
+ 'ۙ' => 230,
208
+ 'ۚ' => 230,
209
+ 'ۛ' => 230,
210
+ 'ۜ' => 230,
211
+ '۟' => 230,
212
+ '۠' => 230,
213
+ 'ۡ' => 230,
214
+ 'ۢ' => 230,
215
+ 'ۣ' => 220,
216
+ 'ۤ' => 230,
217
+ 'ۧ' => 230,
218
+ 'ۨ' => 230,
219
+ '۪' => 220,
220
+ '۫' => 230,
221
+ '۬' => 230,
222
+ 'ۭ' => 220,
223
+ 'ܑ' => 36,
224
+ 'ܰ' => 230,
225
+ 'ܱ' => 220,
226
+ 'ܲ' => 230,
227
+ 'ܳ' => 230,
228
+ 'ܴ' => 220,
229
+ 'ܵ' => 230,
230
+ 'ܶ' => 230,
231
+ 'ܷ' => 220,
232
+ 'ܸ' => 220,
233
+ 'ܹ' => 220,
234
+ 'ܺ' => 230,
235
+ 'ܻ' => 220,
236
+ 'ܼ' => 220,
237
+ 'ܽ' => 230,
238
+ 'ܾ' => 220,
239
+ 'ܿ' => 230,
240
+ '݀' => 230,
241
+ '݁' => 230,
242
+ '݂' => 220,
243
+ '݃' => 230,
244
+ '݄' => 220,
245
+ '݅' => 230,
246
+ '݆' => 220,
247
+ '݇' => 230,
248
+ '݈' => 220,
249
+ '݉' => 230,
250
+ '݊' => 230,
251
+ '߫' => 230,
252
+ '߬' => 230,
253
+ '߭' => 230,
254
+ '߮' => 230,
255
+ '߯' => 230,
256
+ '߰' => 230,
257
+ '߱' => 230,
258
+ '߲' => 220,
259
+ '߳' => 230,
260
+ '߽' => 220,
261
+ 'ࠖ' => 230,
262
+ 'ࠗ' => 230,
263
+ '࠘' => 230,
264
+ '࠙' => 230,
265
+ 'ࠛ' => 230,
266
+ 'ࠜ' => 230,
267
+ 'ࠝ' => 230,
268
+ 'ࠞ' => 230,
269
+ 'ࠟ' => 230,
270
+ 'ࠠ' => 230,
271
+ 'ࠡ' => 230,
272
+ 'ࠢ' => 230,
273
+ 'ࠣ' => 230,
274
+ 'ࠥ' => 230,
275
+ 'ࠦ' => 230,
276
+ 'ࠧ' => 230,
277
+ 'ࠩ' => 230,
278
+ 'ࠪ' => 230,
279
+ 'ࠫ' => 230,
280
+ 'ࠬ' => 230,
281
+ '࠭' => 230,
282
+ '࡙' => 220,
283
+ '࡚' => 220,
284
+ '࡛' => 220,
285
+ '࣓' => 220,
286
+ 'ࣔ' => 230,
287
+ 'ࣕ' => 230,
288
+ 'ࣖ' => 230,
289
+ 'ࣗ' => 230,
290
+ 'ࣘ' => 230,
291
+ 'ࣙ' => 230,
292
+ 'ࣚ' => 230,
293
+ 'ࣛ' => 230,
294
+ 'ࣜ' => 230,
295
+ 'ࣝ' => 230,
296
+ 'ࣞ' => 230,
297
+ 'ࣟ' => 230,
298
+ '࣠' => 230,
299
+ '࣡' => 230,
300
+ 'ࣣ' => 220,
301
+ 'ࣤ' => 230,
302
+ 'ࣥ' => 230,
303
+ 'ࣦ' => 220,
304
+ 'ࣧ' => 230,
305
+ 'ࣨ' => 230,
306
+ 'ࣩ' => 220,
307
+ '࣪' => 230,
308
+ '࣫' => 230,
309
+ '࣬' => 230,
310
+ '࣭' => 220,
311
+ '࣮' => 220,
312
+ '࣯' => 220,
313
+ 'ࣰ' => 27,
314
+ 'ࣱ' => 28,
315
+ 'ࣲ' => 29,
316
+ 'ࣳ' => 230,
317
+ 'ࣴ' => 230,
318
+ 'ࣵ' => 230,
319
+ 'ࣶ' => 220,
320
+ 'ࣷ' => 230,
321
+ 'ࣸ' => 230,
322
+ 'ࣹ' => 220,
323
+ 'ࣺ' => 220,
324
+ 'ࣻ' => 230,
325
+ 'ࣼ' => 230,
326
+ 'ࣽ' => 230,
327
+ 'ࣾ' => 230,
328
+ 'ࣿ' => 230,
329
+ '़' => 7,
330
+ '्' => 9,
331
+ '॑' => 230,
332
+ '॒' => 220,
333
+ '॓' => 230,
334
+ '॔' => 230,
335
+ '়' => 7,
336
+ '্' => 9,
337
+ '৾' => 230,
338
+ '਼' => 7,
339
+ '੍' => 9,
340
+ '઼' => 7,
341
+ '્' => 9,
342
+ '଼' => 7,
343
+ '୍' => 9,
344
+ '்' => 9,
345
+ '్' => 9,
346
+ 'ౕ' => 84,
347
+ 'ౖ' => 91,
348
+ '಼' => 7,
349
+ '್' => 9,
350
+ '഻' => 9,
351
+ '഼' => 9,
352
+ '്' => 9,
353
+ '්' => 9,
354
+ 'ุ' => 103,
355
+ 'ู' => 103,
356
+ 'ฺ' => 9,
357
+ '่' => 107,
358
+ '้' => 107,
359
+ '๊' => 107,
360
+ '๋' => 107,
361
+ 'ຸ' => 118,
362
+ 'ູ' => 118,
363
+ '຺' => 9,
364
+ '່' => 122,
365
+ '້' => 122,
366
+ '໊' => 122,
367
+ '໋' => 122,
368
+ '༘' => 220,
369
+ '༙' => 220,
370
+ '༵' => 220,
371
+ '༷' => 220,
372
+ '༹' => 216,
373
+ 'ཱ' => 129,
374
+ 'ི' => 130,
375
+ 'ུ' => 132,
376
+ 'ེ' => 130,
377
+ 'ཻ' => 130,
378
+ 'ོ' => 130,
379
+ 'ཽ' => 130,
380
+ 'ྀ' => 130,
381
+ 'ྂ' => 230,
382
+ 'ྃ' => 230,
383
+ '྄' => 9,
384
+ '྆' => 230,
385
+ '྇' => 230,
386
+ '࿆' => 220,
387
+ '့' => 7,
388
+ '္' => 9,
389
+ '်' => 9,
390
+ 'ႍ' => 220,
391
+ '፝' => 230,
392
+ '፞' => 230,
393
+ '፟' => 230,
394
+ '᜔' => 9,
395
+ '᜴' => 9,
396
+ '្' => 9,
397
+ '៝' => 230,
398
+ 'ᢩ' => 228,
399
+ '᤹' => 222,
400
+ '᤺' => 230,
401
+ '᤻' => 220,
402
+ 'ᨗ' => 230,
403
+ 'ᨘ' => 220,
404
+ '᩠' => 9,
405
+ '᩵' => 230,
406
+ '᩶' => 230,
407
+ '᩷' => 230,
408
+ '᩸' => 230,
409
+ '᩹' => 230,
410
+ '᩺' => 230,
411
+ '᩻' => 230,
412
+ '᩼' => 230,
413
+ '᩿' => 220,
414
+ '᪰' => 230,
415
+ '᪱' => 230,
416
+ '᪲' => 230,
417
+ '᪳' => 230,
418
+ '᪴' => 230,
419
+ '᪵' => 220,
420
+ '᪶' => 220,
421
+ '᪷' => 220,
422
+ '᪸' => 220,
423
+ '᪹' => 220,
424
+ '᪺' => 220,
425
+ '᪻' => 230,
426
+ '᪼' => 230,
427
+ '᪽' => 220,
428
+ 'ᪿ' => 220,
429
+ 'ᫀ' => 220,
430
+ '᬴' => 7,
431
+ '᭄' => 9,
432
+ '᭫' => 230,
433
+ '᭬' => 220,
434
+ '᭭' => 230,
435
+ '᭮' => 230,
436
+ '᭯' => 230,
437
+ '᭰' => 230,
438
+ '᭱' => 230,
439
+ '᭲' => 230,
440
+ '᭳' => 230,
441
+ '᮪' => 9,
442
+ '᮫' => 9,
443
+ '᯦' => 7,
444
+ '᯲' => 9,
445
+ '᯳' => 9,
446
+ '᰷' => 7,
447
+ '᳐' => 230,
448
+ '᳑' => 230,
449
+ '᳒' => 230,
450
+ '᳔' => 1,
451
+ '᳕' => 220,
452
+ '᳖' => 220,
453
+ '᳗' => 220,
454
+ '᳘' => 220,
455
+ '᳙' => 220,
456
+ '᳚' => 230,
457
+ '᳛' => 230,
458
+ '᳜' => 220,
459
+ '᳝' => 220,
460
+ '᳞' => 220,
461
+ '᳟' => 220,
462
+ '᳠' => 230,
463
+ '᳢' => 1,
464
+ '᳣' => 1,
465
+ '᳤' => 1,
466
+ '᳥' => 1,
467
+ '᳦' => 1,
468
+ '᳧' => 1,
469
+ '᳨' => 1,
470
+ '᳭' => 220,
471
+ '᳴' => 230,
472
+ '᳸' => 230,
473
+ '᳹' => 230,
474
+ '᷀' => 230,
475
+ '᷁' => 230,
476
+ '᷂' => 220,
477
+ '᷃' => 230,
478
+ '᷄' => 230,
479
+ '᷅' => 230,
480
+ '᷆' => 230,
481
+ '᷇' => 230,
482
+ '᷈' => 230,
483
+ '᷉' => 230,
484
+ '᷊' => 220,
485
+ '᷋' => 230,
486
+ '᷌' => 230,
487
+ '᷍' => 234,
488
+ '᷎' => 214,
489
+ '᷏' => 220,
490
+ '᷐' => 202,
491
+ '᷑' => 230,
492
+ '᷒' => 230,
493
+ 'ᷓ' => 230,
494
+ 'ᷔ' => 230,
495
+ 'ᷕ' => 230,
496
+ 'ᷖ' => 230,
497
+ 'ᷗ' => 230,
498
+ 'ᷘ' => 230,
499
+ 'ᷙ' => 230,
500
+ 'ᷚ' => 230,
501
+ 'ᷛ' => 230,
502
+ 'ᷜ' => 230,
503
+ 'ᷝ' => 230,
504
+ 'ᷞ' => 230,
505
+ 'ᷟ' => 230,
506
+ 'ᷠ' => 230,
507
+ 'ᷡ' => 230,
508
+ 'ᷢ' => 230,
509
+ 'ᷣ' => 230,
510
+ 'ᷤ' => 230,
511
+ 'ᷥ' => 230,
512
+ 'ᷦ' => 230,
513
+ 'ᷧ' => 230,
514
+ 'ᷨ' => 230,
515
+ 'ᷩ' => 230,
516
+ 'ᷪ' => 230,
517
+ 'ᷫ' => 230,
518
+ 'ᷬ' => 230,
519
+ 'ᷭ' => 230,
520
+ 'ᷮ' => 230,
521
+ 'ᷯ' => 230,
522
+ 'ᷰ' => 230,
523
+ 'ᷱ' => 230,
524
+ 'ᷲ' => 230,
525
+ 'ᷳ' => 230,
526
+ 'ᷴ' => 230,
527
+ '᷵' => 230,
528
+ '᷶' => 232,
529
+ '᷷' => 228,
530
+ '᷸' => 228,
531
+ '᷹' => 220,
532
+ '᷻' => 230,
533
+ '᷼' => 233,
534
+ '᷽' => 220,
535
+ '᷾' => 230,
536
+ '᷿' => 220,
537
+ '⃐' => 230,
538
+ '⃑' => 230,
539
+ '⃒' => 1,
540
+ '⃓' => 1,
541
+ '⃔' => 230,
542
+ '⃕' => 230,
543
+ '⃖' => 230,
544
+ '⃗' => 230,
545
+ '⃘' => 1,
546
+ '⃙' => 1,
547
+ '⃚' => 1,
548
+ '⃛' => 230,
549
+ '⃜' => 230,
550
+ '⃡' => 230,
551
+ '⃥' => 1,
552
+ '⃦' => 1,
553
+ '⃧' => 230,
554
+ '⃨' => 220,
555
+ '⃩' => 230,
556
+ '⃪' => 1,
557
+ '⃫' => 1,
558
+ '⃬' => 220,
559
+ '⃭' => 220,
560
+ '⃮' => 220,
561
+ '⃯' => 220,
562
+ '⃰' => 230,
563
+ '⳯' => 230,
564
+ '⳰' => 230,
565
+ '⳱' => 230,
566
+ '⵿' => 9,
567
+ 'ⷠ' => 230,
568
+ 'ⷡ' => 230,
569
+ 'ⷢ' => 230,
570
+ 'ⷣ' => 230,
571
+ 'ⷤ' => 230,
572
+ 'ⷥ' => 230,
573
+ 'ⷦ' => 230,
574
+ 'ⷧ' => 230,
575
+ 'ⷨ' => 230,
576
+ 'ⷩ' => 230,
577
+ 'ⷪ' => 230,
578
+ 'ⷫ' => 230,
579
+ 'ⷬ' => 230,
580
+ 'ⷭ' => 230,
581
+ 'ⷮ' => 230,
582
+ 'ⷯ' => 230,
583
+ 'ⷰ' => 230,
584
+ 'ⷱ' => 230,
585
+ 'ⷲ' => 230,
586
+ 'ⷳ' => 230,
587
+ 'ⷴ' => 230,
588
+ 'ⷵ' => 230,
589
+ 'ⷶ' => 230,
590
+ 'ⷷ' => 230,
591
+ 'ⷸ' => 230,
592
+ 'ⷹ' => 230,
593
+ 'ⷺ' => 230,
594
+ 'ⷻ' => 230,
595
+ 'ⷼ' => 230,
596
+ 'ⷽ' => 230,
597
+ 'ⷾ' => 230,
598
+ 'ⷿ' => 230,
599
+ '〪' => 218,
600
+ '〫' => 228,
601
+ '〬' => 232,
602
+ '〭' => 222,
603
+ '〮' => 224,
604
+ '〯' => 224,
605
+ '゙' => 8,
606
+ '゚' => 8,
607
+ '꙯' => 230,
608
+ 'ꙴ' => 230,
609
+ 'ꙵ' => 230,
610
+ 'ꙶ' => 230,
611
+ 'ꙷ' => 230,
612
+ 'ꙸ' => 230,
613
+ 'ꙹ' => 230,
614
+ 'ꙺ' => 230,
615
+ 'ꙻ' => 230,
616
+ '꙼' => 230,
617
+ '꙽' => 230,
618
+ 'ꚞ' => 230,
619
+ 'ꚟ' => 230,
620
+ '꛰' => 230,
621
+ '꛱' => 230,
622
+ '꠆' => 9,
623
+ '꠬' => 9,
624
+ '꣄' => 9,
625
+ '꣠' => 230,
626
+ '꣡' => 230,
627
+ '꣢' => 230,
628
+ '꣣' => 230,
629
+ '꣤' => 230,
630
+ '꣥' => 230,
631
+ '꣦' => 230,
632
+ '꣧' => 230,
633
+ '꣨' => 230,
634
+ '꣩' => 230,
635
+ '꣪' => 230,
636
+ '꣫' => 230,
637
+ '꣬' => 230,
638
+ '꣭' => 230,
639
+ '꣮' => 230,
640
+ '꣯' => 230,
641
+ '꣰' => 230,
642
+ '꣱' => 230,
643
+ '꤫' => 220,
644
+ '꤬' => 220,
645
+ '꤭' => 220,
646
+ '꥓' => 9,
647
+ '꦳' => 7,
648
+ '꧀' => 9,
649
+ 'ꪰ' => 230,
650
+ 'ꪲ' => 230,
651
+ 'ꪳ' => 230,
652
+ 'ꪴ' => 220,
653
+ 'ꪷ' => 230,
654
+ 'ꪸ' => 230,
655
+ 'ꪾ' => 230,
656
+ '꪿' => 230,
657
+ '꫁' => 230,
658
+ '꫶' => 9,
659
+ '꯭' => 9,
660
+ 'ﬞ' => 26,
661
+ '︠' => 230,
662
+ '︡' => 230,
663
+ '︢' => 230,
664
+ '︣' => 230,
665
+ '︤' => 230,
666
+ '︥' => 230,
667
+ '︦' => 230,
668
+ '︧' => 220,
669
+ '︨' => 220,
670
+ '︩' => 220,
671
+ '︪' => 220,
672
+ '︫' => 220,
673
+ '︬' => 220,
674
+ '︭' => 220,
675
+ '︮' => 230,
676
+ '︯' => 230,
677
+ '𐇽' => 220,
678
+ '𐋠' => 220,
679
+ '𐍶' => 230,
680
+ '𐍷' => 230,
681
+ '𐍸' => 230,
682
+ '𐍹' => 230,
683
+ '𐍺' => 230,
684
+ '𐨍' => 220,
685
+ '𐨏' => 230,
686
+ '𐨸' => 230,
687
+ '𐨹' => 1,
688
+ '𐨺' => 220,
689
+ '𐨿' => 9,
690
+ '𐫥' => 230,
691
+ '𐫦' => 220,
692
+ '𐴤' => 230,
693
+ '𐴥' => 230,
694
+ '𐴦' => 230,
695
+ '𐴧' => 230,
696
+ '𐺫' => 230,
697
+ '𐺬' => 230,
698
+ '𐽆' => 220,
699
+ '𐽇' => 220,
700
+ '𐽈' => 230,
701
+ '𐽉' => 230,
702
+ '𐽊' => 230,
703
+ '𐽋' => 220,
704
+ '𐽌' => 230,
705
+ '𐽍' => 220,
706
+ '𐽎' => 220,
707
+ '𐽏' => 220,
708
+ '𐽐' => 220,
709
+ '𑁆' => 9,
710
+ '𑁿' => 9,
711
+ '𑂹' => 9,
712
+ '𑂺' => 7,
713
+ '𑄀' => 230,
714
+ '𑄁' => 230,
715
+ '𑄂' => 230,
716
+ '𑄳' => 9,
717
+ '𑄴' => 9,
718
+ '𑅳' => 7,
719
+ '𑇀' => 9,
720
+ '𑇊' => 7,
721
+ '𑈵' => 9,
722
+ '𑈶' => 7,
723
+ '𑋩' => 7,
724
+ '𑋪' => 9,
725
+ '𑌻' => 7,
726
+ '𑌼' => 7,
727
+ '𑍍' => 9,
728
+ '𑍦' => 230,
729
+ '𑍧' => 230,
730
+ '𑍨' => 230,
731
+ '𑍩' => 230,
732
+ '𑍪' => 230,
733
+ '𑍫' => 230,
734
+ '𑍬' => 230,
735
+ '𑍰' => 230,
736
+ '𑍱' => 230,
737
+ '𑍲' => 230,
738
+ '𑍳' => 230,
739
+ '𑍴' => 230,
740
+ '𑑂' => 9,
741
+ '𑑆' => 7,
742
+ '𑑞' => 230,
743
+ '𑓂' => 9,
744
+ '𑓃' => 7,
745
+ '𑖿' => 9,
746
+ '𑗀' => 7,
747
+ '𑘿' => 9,
748
+ '𑚶' => 9,
749
+ '𑚷' => 7,
750
+ '𑜫' => 9,
751
+ '𑠹' => 9,
752
+ '𑠺' => 7,
753
+ '𑤽' => 9,
754
+ '𑤾' => 9,
755
+ '𑥃' => 7,
756
+ '𑧠' => 9,
757
+ '𑨴' => 9,
758
+ '𑩇' => 9,
759
+ '𑪙' => 9,
760
+ '𑰿' => 9,
761
+ '𑵂' => 7,
762
+ '𑵄' => 9,
763
+ '𑵅' => 9,
764
+ '𑶗' => 9,
765
+ '𖫰' => 1,
766
+ '𖫱' => 1,
767
+ '𖫲' => 1,
768
+ '𖫳' => 1,
769
+ '𖫴' => 1,
770
+ '𖬰' => 230,
771
+ '𖬱' => 230,
772
+ '𖬲' => 230,
773
+ '𖬳' => 230,
774
+ '𖬴' => 230,
775
+ '𖬵' => 230,
776
+ '𖬶' => 230,
777
+ '𖿰' => 6,
778
+ '𖿱' => 6,
779
+ '𛲞' => 1,
780
+ '𝅥' => 216,
781
+ '𝅦' => 216,
782
+ '𝅧' => 1,
783
+ '𝅨' => 1,
784
+ '𝅩' => 1,
785
+ '𝅭' => 226,
786
+ '𝅮' => 216,
787
+ '𝅯' => 216,
788
+ '𝅰' => 216,
789
+ '𝅱' => 216,
790
+ '𝅲' => 216,
791
+ '𝅻' => 220,
792
+ '𝅼' => 220,
793
+ '𝅽' => 220,
794
+ '𝅾' => 220,
795
+ '𝅿' => 220,
796
+ '𝆀' => 220,
797
+ '𝆁' => 220,
798
+ '𝆂' => 220,
799
+ '𝆅' => 230,
800
+ '𝆆' => 230,
801
+ '𝆇' => 230,
802
+ '𝆈' => 230,
803
+ '𝆉' => 230,
804
+ '𝆊' => 220,
805
+ '𝆋' => 220,
806
+ '𝆪' => 230,
807
+ '𝆫' => 230,
808
+ '𝆬' => 230,
809
+ '𝆭' => 230,
810
+ '𝉂' => 230,
811
+ '𝉃' => 230,
812
+ '𝉄' => 230,
813
+ '𞀀' => 230,
814
+ '𞀁' => 230,
815
+ '𞀂' => 230,
816
+ '𞀃' => 230,
817
+ '𞀄' => 230,
818
+ '𞀅' => 230,
819
+ '𞀆' => 230,
820
+ '𞀈' => 230,
821
+ '𞀉' => 230,
822
+ '𞀊' => 230,
823
+ '𞀋' => 230,
824
+ '𞀌' => 230,
825
+ '𞀍' => 230,
826
+ '𞀎' => 230,
827
+ '𞀏' => 230,
828
+ '𞀐' => 230,
829
+ '𞀑' => 230,
830
+ '𞀒' => 230,
831
+ '𞀓' => 230,
832
+ '𞀔' => 230,
833
+ '𞀕' => 230,
834
+ '𞀖' => 230,
835
+ '𞀗' => 230,
836
+ '𞀘' => 230,
837
+ '𞀛' => 230,
838
+ '𞀜' => 230,
839
+ '𞀝' => 230,
840
+ '𞀞' => 230,
841
+ '𞀟' => 230,
842
+ '𞀠' => 230,
843
+ '𞀡' => 230,
844
+ '𞀣' => 230,
845
+ '𞀤' => 230,
846
+ '𞀦' => 230,
847
+ '𞀧' => 230,
848
+ '𞀨' => 230,
849
+ '𞀩' => 230,
850
+ '𞀪' => 230,
851
+ '𞄰' => 230,
852
+ '𞄱' => 230,
853
+ '𞄲' => 230,
854
+ '𞄳' => 230,
855
+ '𞄴' => 230,
856
+ '𞄵' => 230,
857
+ '𞄶' => 230,
858
+ '𞋬' => 230,
859
+ '𞋭' => 230,
860
+ '𞋮' => 230,
861
+ '𞋯' => 230,
862
+ '𞣐' => 220,
863
+ '𞣑' => 220,
864
+ '𞣒' => 220,
865
+ '𞣓' => 220,
866
+ '𞣔' => 220,
867
+ '𞣕' => 220,
868
+ '𞣖' => 220,
869
+ '𞥄' => 230,
870
+ '𞥅' => 230,
871
+ '𞥆' => 230,
872
+ '𞥇' => 230,
873
+ '𞥈' => 230,
874
+ '𞥉' => 230,
875
+ '𞥊' => 7,
876
+ );
vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php ADDED
@@ -0,0 +1,3695 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ ' ' => ' ',
5
+ '¨' => ' ̈',
6
+ 'ª' => 'a',
7
+ '¯' => ' ̄',
8
+ '²' => '2',
9
+ '³' => '3',
10
+ '´' => ' ́',
11
+ 'µ' => 'μ',
12
+ '¸' => ' ̧',
13
+ '¹' => '1',
14
+ 'º' => 'o',
15
+ '¼' => '1⁄4',
16
+ '½' => '1⁄2',
17
+ '¾' => '3⁄4',
18
+ 'IJ' => 'IJ',
19
+ 'ij' => 'ij',
20
+ 'Ŀ' => 'L·',
21
+ 'ŀ' => 'l·',
22
+ 'ʼn' => 'ʼn',
23
+ 'ſ' => 's',
24
+ 'DŽ' => 'DŽ',
25
+ 'Dž' => 'Dž',
26
+ 'dž' => 'dž',
27
+ 'LJ' => 'LJ',
28
+ 'Lj' => 'Lj',
29
+ 'lj' => 'lj',
30
+ 'NJ' => 'NJ',
31
+ 'Nj' => 'Nj',
32
+ 'nj' => 'nj',
33
+ 'DZ' => 'DZ',
34
+ 'Dz' => 'Dz',
35
+ 'dz' => 'dz',
36
+ 'ʰ' => 'h',
37
+ 'ʱ' => 'ɦ',
38
+ 'ʲ' => 'j',
39
+ 'ʳ' => 'r',
40
+ 'ʴ' => 'ɹ',
41
+ 'ʵ' => 'ɻ',
42
+ 'ʶ' => 'ʁ',
43
+ 'ʷ' => 'w',
44
+ 'ʸ' => 'y',
45
+ '˘' => ' ̆',
46
+ '˙' => ' ̇',
47
+ '˚' => ' ̊',
48
+ '˛' => ' ̨',
49
+ '˜' => ' ̃',
50
+ '˝' => ' ̋',
51
+ 'ˠ' => 'ɣ',
52
+ 'ˡ' => 'l',
53
+ 'ˢ' => 's',
54
+ 'ˣ' => 'x',
55
+ 'ˤ' => 'ʕ',
56
+ 'ͺ' => ' ͅ',
57
+ '΄' => ' ́',
58
+ '΅' => ' ̈́',
59
+ 'ϐ' => 'β',
60
+ 'ϑ' => 'θ',
61
+ 'ϒ' => 'Υ',
62
+ 'ϓ' => 'Ύ',
63
+ 'ϔ' => 'Ϋ',
64
+ 'ϕ' => 'φ',
65
+ 'ϖ' => 'π',
66
+ 'ϰ' => 'κ',
67
+ 'ϱ' => 'ρ',
68
+ 'ϲ' => 'ς',
69
+ 'ϴ' => 'Θ',
70
+ 'ϵ' => 'ε',
71
+ 'Ϲ' => 'Σ',
72
+ 'և' => 'եւ',
73
+ 'ٵ' => 'اٴ',
74
+ 'ٶ' => 'وٴ',
75
+ 'ٷ' => 'ۇٴ',
76
+ 'ٸ' => 'يٴ',
77
+ 'ำ' => 'ํา',
78
+ 'ຳ' => 'ໍາ',
79
+ 'ໜ' => 'ຫນ',
80
+ 'ໝ' => 'ຫມ',
81
+ '༌' => '་',
82
+ 'ཷ' => 'ྲཱྀ',
83
+ 'ཹ' => 'ླཱྀ',
84
+ 'ჼ' => 'ნ',
85
+ 'ᴬ' => 'A',
86
+ 'ᴭ' => 'Æ',
87
+ 'ᴮ' => 'B',
88
+ 'ᴰ' => 'D',
89
+ 'ᴱ' => 'E',
90
+ 'ᴲ' => 'Ǝ',
91
+ 'ᴳ' => 'G',
92
+ 'ᴴ' => 'H',
93
+ 'ᴵ' => 'I',
94
+ 'ᴶ' => 'J',
95
+ 'ᴷ' => 'K',
96
+ 'ᴸ' => 'L',
97
+ 'ᴹ' => 'M',
98
+ 'ᴺ' => 'N',
99
+ 'ᴼ' => 'O',
100
+ 'ᴽ' => 'Ȣ',
101
+ 'ᴾ' => 'P',
102
+ 'ᴿ' => 'R',
103
+ 'ᵀ' => 'T',
104
+ 'ᵁ' => 'U',
105
+ 'ᵂ' => 'W',
106
+ 'ᵃ' => 'a',
107
+ 'ᵄ' => 'ɐ',
108
+ 'ᵅ' => 'ɑ',
109
+ 'ᵆ' => 'ᴂ',
110
+ 'ᵇ' => 'b',
111
+ 'ᵈ' => 'd',
112
+ 'ᵉ' => 'e',
113
+ 'ᵊ' => 'ə',
114
+ 'ᵋ' => 'ɛ',
115
+ 'ᵌ' => 'ɜ',
116
+ 'ᵍ' => 'g',
117
+ 'ᵏ' => 'k',
118
+ 'ᵐ' => 'm',
119
+ 'ᵑ' => 'ŋ',
120
+ 'ᵒ' => 'o',
121
+ 'ᵓ' => 'ɔ',
122
+ 'ᵔ' => 'ᴖ',
123
+ 'ᵕ' => 'ᴗ',
124
+ 'ᵖ' => 'p',
125
+ 'ᵗ' => 't',
126
+ 'ᵘ' => 'u',
127
+ 'ᵙ' => 'ᴝ',
128
+ 'ᵚ' => 'ɯ',
129
+ 'ᵛ' => 'v',
130
+ 'ᵜ' => 'ᴥ',
131
+ 'ᵝ' => 'β',
132
+ 'ᵞ' => 'γ',
133
+ 'ᵟ' => 'δ',
134
+ 'ᵠ' => 'φ',
135
+ 'ᵡ' => 'χ',
136
+ 'ᵢ' => 'i',
137
+ 'ᵣ' => 'r',
138
+ 'ᵤ' => 'u',
139
+ 'ᵥ' => 'v',
140
+ 'ᵦ' => 'β',
141
+ 'ᵧ' => 'γ',
142
+ 'ᵨ' => 'ρ',
143
+ 'ᵩ' => 'φ',
144
+ 'ᵪ' => 'χ',
145
+ 'ᵸ' => 'н',
146
+ 'ᶛ' => 'ɒ',
147
+ 'ᶜ' => 'c',
148
+ 'ᶝ' => 'ɕ',
149
+ 'ᶞ' => 'ð',
150
+ 'ᶟ' => 'ɜ',
151
+ 'ᶠ' => 'f',
152
+ 'ᶡ' => 'ɟ',
153
+ 'ᶢ' => 'ɡ',
154
+ 'ᶣ' => 'ɥ',
155
+ 'ᶤ' => 'ɨ',
156
+ 'ᶥ' => 'ɩ',
157
+ 'ᶦ' => 'ɪ',
158
+ 'ᶧ' => 'ᵻ',
159
+ 'ᶨ' => 'ʝ',
160
+ 'ᶩ' => 'ɭ',
161
+ 'ᶪ' => 'ᶅ',
162
+ 'ᶫ' => 'ʟ',
163
+ 'ᶬ' => 'ɱ',
164
+ 'ᶭ' => 'ɰ',
165
+ 'ᶮ' => 'ɲ',
166
+ 'ᶯ' => 'ɳ',
167
+ 'ᶰ' => 'ɴ',
168
+ 'ᶱ' => 'ɵ',
169
+ 'ᶲ' => 'ɸ',
170
+ 'ᶳ' => 'ʂ',
171
+ 'ᶴ' => 'ʃ',
172
+ 'ᶵ' => 'ƫ',
173
+ 'ᶶ' => 'ʉ',
174
+ 'ᶷ' => 'ʊ',
175
+ 'ᶸ' => 'ᴜ',
176
+ 'ᶹ' => 'ʋ',
177
+ 'ᶺ' => 'ʌ',
178
+ 'ᶻ' => 'z',
179
+ 'ᶼ' => 'ʐ',
180
+ 'ᶽ' => 'ʑ',
181
+ 'ᶾ' => 'ʒ',
182
+ 'ᶿ' => 'θ',
183
+ 'ẚ' => 'aʾ',
184
+ 'ẛ' => 'ṡ',
185
+ '᾽' => ' ̓',
186
+ '᾿' => ' ̓',
187
+ '῀' => ' ͂',
188
+ '῁' => ' ̈͂',
189
+ '῍' => ' ̓̀',
190
+ '῎' => ' ̓́',
191
+ '῏' => ' ̓͂',
192
+ '῝' => ' ̔̀',
193
+ '῞' => ' ̔́',
194
+ '῟' => ' ̔͂',
195
+ '῭' => ' ̈̀',
196
+ '΅' => ' ̈́',
197
+ '´' => ' ́',
198
+ '῾' => ' ̔',
199
+ ' ' => ' ',
200
+ ' ' => ' ',
201
+ ' ' => ' ',
202
+ ' ' => ' ',
203
+ ' ' => ' ',
204
+ ' ' => ' ',
205
+ ' ' => ' ',
206
+ ' ' => ' ',
207
+ ' ' => ' ',
208
+ ' ' => ' ',
209
+ ' ' => ' ',
210
+ '‑' => '‐',
211
+ '‗' => ' ̳',
212
+ '․' => '.',
213
+ '‥' => '..',
214
+ '…' => '...',
215
+ ' ' => ' ',
216
+ '″' => '′′',
217
+ '‴' => '′′′',
218
+ '‶' => '‵‵',
219
+ '‷' => '‵‵‵',
220
+ '‼' => '!!',
221
+ '‾' => ' ̅',
222
+ '⁇' => '??',
223
+ '⁈' => '?!',
224
+ '⁉' => '!?',
225
+ '⁗' => '′′′′',
226
+ ' ' => ' ',
227
+ '⁰' => '0',
228
+ 'ⁱ' => 'i',
229
+ '⁴' => '4',
230
+ '⁵' => '5',
231
+ '⁶' => '6',
232
+ '⁷' => '7',
233
+ '⁸' => '8',
234
+ '⁹' => '9',
235
+ '⁺' => '+',
236
+ '⁻' => '−',
237
+ '⁼' => '=',
238
+ '⁽' => '(',
239
+ '⁾' => ')',
240
+ 'ⁿ' => 'n',
241
+ '₀' => '0',
242
+ '₁' => '1',
243
+ '₂' => '2',
244
+ '₃' => '3',
245
+ '₄' => '4',
246
+ '₅' => '5',
247
+ '₆' => '6',
248
+ '₇' => '7',
249
+ '₈' => '8',
250
+ '₉' => '9',
251
+ '₊' => '+',
252
+ '₋' => '−',
253
+ '₌' => '=',
254
+ '₍' => '(',
255
+ '₎' => ')',
256
+ 'ₐ' => 'a',
257
+ 'ₑ' => 'e',
258
+ 'ₒ' => 'o',
259
+ 'ₓ' => 'x',
260
+ 'ₔ' => 'ə',
261
+ 'ₕ' => 'h',
262
+ 'ₖ' => 'k',
263
+ 'ₗ' => 'l',
264
+ 'ₘ' => 'm',
265
+ 'ₙ' => 'n',
266
+ 'ₚ' => 'p',
267
+ 'ₛ' => 's',
268
+ 'ₜ' => 't',
269
+ '₨' => 'Rs',
270
+ '℀' => 'a/c',
271
+ '℁' => 'a/s',
272
+ 'ℂ' => 'C',
273
+ '℃' => '°C',
274
+ '℅' => 'c/o',
275
+ '℆' => 'c/u',
276
+ 'ℇ' => 'Ɛ',
277
+ '℉' => '°F',
278
+ 'ℊ' => 'g',
279
+ 'ℋ' => 'H',
280
+ 'ℌ' => 'H',
281
+ 'ℍ' => 'H',
282
+ 'ℎ' => 'h',
283
+ 'ℏ' => 'ħ',
284
+ 'ℐ' => 'I',
285
+ 'ℑ' => 'I',
286
+ 'ℒ' => 'L',
287
+ 'ℓ' => 'l',
288
+ 'ℕ' => 'N',
289
+ '№' => 'No',
290
+ 'ℙ' => 'P',
291
+ 'ℚ' => 'Q',
292
+ 'ℛ' => 'R',
293
+ 'ℜ' => 'R',
294
+ 'ℝ' => 'R',
295
+ '℠' => 'SM',
296
+ '℡' => 'TEL',
297
+ '™' => 'TM',
298
+ 'ℤ' => 'Z',
299
+ 'ℨ' => 'Z',
300
+ 'ℬ' => 'B',
301
+ 'ℭ' => 'C',
302
+ 'ℯ' => 'e',
303
+ 'ℰ' => 'E',
304
+ 'ℱ' => 'F',
305
+ 'ℳ' => 'M',
306
+ 'ℴ' => 'o',
307
+ 'ℵ' => 'א',
308
+ 'ℶ' => 'ב',
309
+ 'ℷ' => 'ג',
310
+ 'ℸ' => 'ד',
311
+ 'ℹ' => 'i',
312
+ '℻' => 'FAX',
313
+ 'ℼ' => 'π',
314
+ 'ℽ' => 'γ',
315
+ 'ℾ' => 'Γ',
316
+ 'ℿ' => 'Π',
317
+ '⅀' => '∑',
318
+ 'ⅅ' => 'D',
319
+ 'ⅆ' => 'd',
320
+ 'ⅇ' => 'e',
321
+ 'ⅈ' => 'i',
322
+ 'ⅉ' => 'j',
323
+ '⅐' => '1⁄7',
324
+ '⅑' => '1⁄9',
325
+ '⅒' => '1⁄10',
326
+ '⅓' => '1⁄3',
327
+ '⅔' => '2⁄3',
328
+ '⅕' => '1⁄5',
329
+ '⅖' => '2⁄5',
330
+ '⅗' => '3⁄5',
331
+ '⅘' => '4⁄5',
332
+ '⅙' => '1⁄6',
333
+ '⅚' => '5⁄6',
334
+ '⅛' => '1⁄8',
335
+ '⅜' => '3⁄8',
336
+ '⅝' => '5⁄8',
337
+ '⅞' => '7⁄8',
338
+ '⅟' => '1⁄',
339
+ 'Ⅰ' => 'I',
340
+ 'Ⅱ' => 'II',
341
+ 'Ⅲ' => 'III',
342
+ 'Ⅳ' => 'IV',
343
+ 'Ⅴ' => 'V',
344
+ 'Ⅵ' => 'VI',
345
+ 'Ⅶ' => 'VII',
346
+ 'Ⅷ' => 'VIII',
347
+ 'Ⅸ' => 'IX',
348
+ 'Ⅹ' => 'X',
349
+ 'Ⅺ' => 'XI',
350
+ 'Ⅻ' => 'XII',
351
+ 'Ⅼ' => 'L',
352
+ 'Ⅽ' => 'C',
353
+ 'Ⅾ' => 'D',
354
+ 'Ⅿ' => 'M',
355
+ 'ⅰ' => 'i',
356
+ 'ⅱ' => 'ii',
357
+ 'ⅲ' => 'iii',
358
+ 'ⅳ' => 'iv',
359
+ 'ⅴ' => 'v',
360
+ 'ⅵ' => 'vi',
361
+ 'ⅶ' => 'vii',
362
+ 'ⅷ' => 'viii',
363
+ 'ⅸ' => 'ix',
364
+ 'ⅹ' => 'x',
365
+ 'ⅺ' => 'xi',
366
+ 'ⅻ' => 'xii',
367
+ 'ⅼ' => 'l',
368
+ 'ⅽ' => 'c',
369
+ 'ⅾ' => 'd',
370
+ 'ⅿ' => 'm',
371
+ '↉' => '0⁄3',
372
+ '∬' => '∫∫',
373
+ '∭' => '∫∫∫',
374
+ '∯' => '∮∮',
375
+ '∰' => '∮∮∮',
376
+ '①' => '1',
377
+ '②' => '2',
378
+ '③' => '3',
379
+ '④' => '4',
380
+ '⑤' => '5',
381
+ '⑥' => '6',
382
+ '⑦' => '7',
383
+ '⑧' => '8',
384
+ '⑨' => '9',
385
+ '⑩' => '10',
386
+ '⑪' => '11',
387
+ '⑫' => '12',
388
+ '⑬' => '13',
389
+ '⑭' => '14',
390
+ '⑮' => '15',
391
+ '⑯' => '16',
392
+ '⑰' => '17',
393
+ '⑱' => '18',
394
+ '⑲' => '19',
395
+ '⑳' => '20',
396
+ '⑴' => '(1)',
397
+ '⑵' => '(2)',
398
+ '⑶' => '(3)',
399
+ '⑷' => '(4)',
400
+ '⑸' => '(5)',
401
+ '⑹' => '(6)',
402
+ '⑺' => '(7)',
403
+ '⑻' => '(8)',
404
+ '⑼' => '(9)',
405
+ '⑽' => '(10)',
406
+ '⑾' => '(11)',
407
+ '⑿' => '(12)',
408
+ '⒀' => '(13)',
409
+ '⒁' => '(14)',
410
+ '⒂' => '(15)',
411
+ '⒃' => '(16)',
412
+ '⒄' => '(17)',
413
+ '⒅' => '(18)',
414
+ '⒆' => '(19)',
415
+ '⒇' => '(20)',
416
+ '⒈' => '1.',
417
+ '⒉' => '2.',
418
+ '⒊' => '3.',
419
+ '⒋' => '4.',
420
+ '⒌' => '5.',
421
+ '⒍' => '6.',
422
+ '⒎' => '7.',
423
+ '⒏' => '8.',
424
+ '⒐' => '9.',
425
+ '⒑' => '10.',
426
+ '⒒' => '11.',
427
+ '⒓' => '12.',
428
+ '⒔' => '13.',
429
+ '⒕' => '14.',
430
+ '⒖' => '15.',
431
+ '⒗' => '16.',
432
+ '⒘' => '17.',
433
+ '⒙' => '18.',
434
+ '⒚' => '19.',
435
+ '⒛' => '20.',
436
+ '⒜' => '(a)',
437
+ '⒝' => '(b)',
438
+ '⒞' => '(c)',
439
+ '⒟' => '(d)',
440
+ '⒠' => '(e)',
441
+ '⒡' => '(f)',
442
+ '⒢' => '(g)',
443
+ '⒣' => '(h)',
444
+ '⒤' => '(i)',
445
+ '⒥' => '(j)',
446
+ '⒦' => '(k)',
447
+ '⒧' => '(l)',
448
+ '⒨' => '(m)',
449
+ '⒩' => '(n)',
450
+ '⒪' => '(o)',
451
+ '⒫' => '(p)',
452
+ '⒬' => '(q)',
453
+ '⒭' => '(r)',
454
+ '⒮' => '(s)',
455
+ '⒯' => '(t)',
456
+ '⒰' => '(u)',
457
+ '⒱' => '(v)',
458
+ '⒲' => '(w)',
459
+ '⒳' => '(x)',
460
+ '⒴' => '(y)',
461
+ '⒵' => '(z)',
462
+ 'Ⓐ' => 'A',
463
+ 'Ⓑ' => 'B',
464
+ 'Ⓒ' => 'C',
465
+ 'Ⓓ' => 'D',
466
+ 'Ⓔ' => 'E',
467
+ 'Ⓕ' => 'F',
468
+ 'Ⓖ' => 'G',
469
+ 'Ⓗ' => 'H',
470
+ 'Ⓘ' => 'I',
471
+ 'Ⓙ' => 'J',
472
+ 'Ⓚ' => 'K',
473
+ 'Ⓛ' => 'L',
474
+ 'Ⓜ' => 'M',
475
+ 'Ⓝ' => 'N',
476
+ 'Ⓞ' => 'O',
477
+ 'Ⓟ' => 'P',
478
+ 'Ⓠ' => 'Q',
479
+ 'Ⓡ' => 'R',
480
+ 'Ⓢ' => 'S',
481
+ 'Ⓣ' => 'T',
482
+ 'Ⓤ' => 'U',
483
+ 'Ⓥ' => 'V',
484
+ 'Ⓦ' => 'W',
485
+ 'Ⓧ' => 'X',
486
+ 'Ⓨ' => 'Y',
487
+ 'Ⓩ' => 'Z',
488
+ 'ⓐ' => 'a',
489
+ 'ⓑ' => 'b',
490
+ 'ⓒ' => 'c',
491
+ 'ⓓ' => 'd',
492
+ 'ⓔ' => 'e',
493
+ 'ⓕ' => 'f',
494
+ 'ⓖ' => 'g',
495
+ 'ⓗ' => 'h',
496
+ 'ⓘ' => 'i',
497
+ 'ⓙ' => 'j',
498
+ 'ⓚ' => 'k',
499
+ 'ⓛ' => 'l',
500
+ 'ⓜ' => 'm',
501
+ 'ⓝ' => 'n',
502
+ 'ⓞ' => 'o',
503
+ 'ⓟ' => 'p',
504
+ 'ⓠ' => 'q',
505
+ 'ⓡ' => 'r',
506
+ 'ⓢ' => 's',
507
+ 'ⓣ' => 't',
508
+ 'ⓤ' => 'u',
509
+ 'ⓥ' => 'v',
510
+ 'ⓦ' => 'w',
511
+ 'ⓧ' => 'x',
512
+ 'ⓨ' => 'y',
513
+ 'ⓩ' => 'z',
514
+ '⓪' => '0',
515
+ '⨌' => '∫∫∫∫',
516
+ '⩴' => '::=',
517
+ '⩵' => '==',
518
+ '⩶' => '===',
519
+ 'ⱼ' => 'j',
520
+ 'ⱽ' => 'V',
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
+ '⽻' => '羽',
648
+ '⽼' => '老',
649
+ '⽽' => '而',
650
+ '⽾' => '耒',
651
+ '⽿' => '耳',
652
+ '⾀' => '聿',
653
+ '⾁' => '肉',
654
+ '⾂' => '臣',
655
+ '⾃' => '自',
656
+ '⾄' => '至',
657
+ '⾅' => '臼',
658
+ '⾆' => '舌',
659
+ '⾇' => '舛',
660
+ '⾈' => '舟',
661
+ '⾉' => '艮',
662
+ '⾊' => '色',
663
+ '⾋' => '艸',
664
+ '⾌' => '虍',
665
+ '⾍' => '虫',
666
+ '⾎' => '血',
667
+ '⾏' => '行',
668
+ '⾐' => '衣',
669
+ '⾑' => '襾',
670
+ '⾒' => '見',
671
+ '⾓' => '角',
672
+ '⾔' => '言',
673
+ '⾕' => '谷',
674
+ '⾖' => '豆',
675
+ '⾗' => '豕',
676
+ '⾘' => '豸',
677
+ '⾙' => '貝',
678
+ '⾚' => '赤',
679
+ '⾛' => '走',
680
+ '⾜' => '足',
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
+ '⿅' => '鹿',
722
+ '⿆' => '麥',
723
+ '⿇' => '麻',
724
+ '⿈' => '黃',
725
+ '⿉' => '黍',
726
+ '⿊' => '黑',
727
+ '⿋' => '黹',
728
+ '⿌' => '黽',
729
+ '⿍' => '鼎',
730
+ '⿎' => '鼓',
731
+ '⿏' => '鼠',
732
+ '⿐' => '鼻',
733
+ '⿑' => '齊',
734
+ '⿒' => '齒',
735
+ '⿓' => '龍',
736
+ '⿔' => '龜',
737
+ '⿕' => '龠',
738
+ ' ' => ' ',
739
+ '〶' => '〒',
740
+ '〸' => '十',
741
+ '〹' => '卄',
742
+ '〺' => '卅',
743
+ '゛' => ' ゙',
744
+ '゜' => ' ゚',
745
+ 'ゟ' => 'より',
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
+ 'ㅘ' => 'ᅪ',
787
+ 'ㅙ' => 'ᅫ',
788
+ 'ㅚ' => 'ᅬ',
789
+ 'ㅛ' => 'ᅭ',
790
+ 'ㅜ' => 'ᅮ',
791
+ 'ㅝ' => 'ᅯ',
792
+ 'ㅞ' => 'ᅰ',
793
+ 'ㅟ' => 'ᅱ',
794
+ 'ㅠ' => 'ᅲ',
795
+ 'ㅡ' => 'ᅳ',
796
+ 'ㅢ' => 'ᅴ',
797
+ 'ㅣ' => 'ᅵ',
798
+ 'ㅤ' => 'ᅠ',
799
+ 'ㅥ' => 'ᄔ',
800
+ 'ㅦ' => 'ᄕ',
801
+ 'ㅧ' => 'ᇇ',
802
+ 'ㅨ' => 'ᇈ',
803
+ 'ㅩ' => 'ᇌ',
804
+ 'ㅪ' => 'ᇎ',
805
+ 'ㅫ' => 'ᇓ',
806
+ 'ㅬ' => 'ᇗ',
807
+ 'ㅭ' => 'ᇙ',
808
+ 'ㅮ' => 'ᄜ',
809
+ 'ㅯ' => 'ᇝ',
810
+ 'ㅰ' => 'ᇟ',
811
+ 'ㅱ' => 'ᄝ',
812
+ 'ㅲ' => 'ᄞ',
813
+ 'ㅳ' => 'ᄠ',
814
+ 'ㅴ' => 'ᄢ',
815
+ 'ㅵ' => 'ᄣ',
816
+ 'ㅶ' => 'ᄧ',
817
+ 'ㅷ' => 'ᄩ',
818
+ 'ㅸ' => 'ᄫ',
819
+ 'ㅹ' => 'ᄬ',
820
+ 'ㅺ' => 'ᄭ',
821
+ 'ㅻ' => 'ᄮ',
822
+ 'ㅼ' => 'ᄯ',
823
+ 'ㅽ' => 'ᄲ',
824
+ 'ㅾ' => 'ᄶ',
825
+ 'ㅿ' => 'ᅀ',
826
+ 'ㆀ' => 'ᅇ',
827
+ 'ㆁ' => 'ᅌ',
828
+ 'ㆂ' => 'ᇱ',
829
+ 'ㆃ' => 'ᇲ',
830
+ 'ㆄ' => 'ᅗ',
831
+ 'ㆅ' => 'ᅘ',
832
+ 'ㆆ' => 'ᅙ',
833
+ 'ㆇ' => 'ᆄ',
834
+ 'ㆈ' => 'ᆅ',
835
+ 'ㆉ' => 'ᆈ',
836
+ 'ㆊ' => 'ᆑ',
837
+ 'ㆋ' => 'ᆒ',
838
+ 'ㆌ' => 'ᆔ',
839
+ 'ㆍ' => 'ᆞ',
840
+ 'ㆎ' => 'ᆡ',
841
+ '㆒' => '一',
842
+ '㆓' => '二',
843
+ '㆔' => '三',
844
+ '㆕' => '四',
845
+ '㆖' => '上',
846
+ '㆗' => '中',
847
+ '㆘' => '下',
848
+ '㆙' => '甲',
849
+ '㆚' => '乙',
850
+ '㆛' => '丙',
851
+ '㆜' => '丁',
852
+ '㆝' => '天',
853
+ '㆞' => '地',
854
+ '㆟' => '人',
855
+ '㈀' => '(ᄀ)',
856
+ '㈁' => '(ᄂ)',
857
+ '㈂' => '(ᄃ)',
858
+ '㈃' => '(ᄅ)',
859
+ '㈄' => '(ᄆ)',
860
+ '㈅' => '(ᄇ)',
861
+ '㈆' => '(ᄉ)',
862
+ '㈇' => '(ᄋ)',
863
+ '㈈' => '(ᄌ)',
864
+ '㈉' => '(ᄎ)',
865
+ '㈊' => '(ᄏ)',
866
+ '㈋' => '(ᄐ)',
867
+ '㈌' => '(ᄑ)',
868
+ '㈍' => '(ᄒ)',
869
+ '㈎' => '(가)',
870
+ '㈏' => '(나)',
871
+ '㈐' => '(다)',
872
+ '㈑' => '(라)',
873
+ '㈒' => '(마)',
874
+ '㈓' => '(바)',
875
+ '㈔' => '(사)',
876
+ '㈕' => '(아)',
877
+ '㈖' => '(자)',
878
+ '㈗' => '(차)',
879
+ '㈘' => '(카)',
880
+ '㈙' => '(타)',
881
+ '㈚' => '(파)',
882
+ '㈛' => '(하)',
883
+ '㈜' => '(주)',
884
+ '㈝' => '(오전)',
885
+ '㈞' => '(오후)',
886
+ '㈠' => '(一)',
887
+ '㈡' => '(二)',
888
+ '㈢' => '(三)',
889
+ '㈣' => '(四)',
890
+ '㈤' => '(五)',
891
+ '㈥' => '(六)',
892
+ '㈦' => '(七)',
893
+ '㈧' => '(八)',
894
+ '㈨' => '(九)',
895
+ '㈩' => '(十)',
896
+ '㈪' => '(月)',
897
+ '㈫' => '(火)',
898
+ '㈬' => '(水)',
899
+ '㈭' => '(木)',
900
+ '㈮' => '(金)',
901
+ '㈯' => '(土)',
902
+ '㈰' => '(日)',
903
+ '㈱' => '(株)',
904
+ '㈲' => '(有)',
905
+ '㈳' => '(社)',
906
+ '㈴' => '(名)',
907
+ '㈵' => '(特)',
908
+ '㈶' => '(財)',
909
+ '㈷' => '(祝)',
910
+ '㈸' => '(労)',
911
+ '㈹' => '(代)',
912
+ '㈺' => '(呼)',
913
+ '㈻' => '(学)',
914
+ '㈼' => '(監)',
915
+ '㈽' => '(企)',
916
+ '㈾' => '(資)',
917
+ '㈿' => '(協)',
918
+ '㉀' => '(祭)',
919
+ '㉁' => '(休)',
920
+ '㉂' => '(自)',
921
+ '㉃' => '(至)',
922
+ '㉄' => '問',
923
+ '㉅' => '幼',
924
+ '㉆' => '文',
925
+ '㉇' => '箏',
926
+ '㉐' => 'PTE',
927
+ '㉑' => '21',
928
+ '㉒' => '22',
929
+ '㉓' => '23',
930
+ '㉔' => '24',
931
+ '㉕' => '25',
932
+ '㉖' => '26',
933
+ '㉗' => '27',
934
+ '㉘' => '28',
935
+ '㉙' => '29',
936
+ '㉚' => '30',
937
+ '㉛' => '31',
938
+ '㉜' => '32',
939
+ '㉝' => '33',
940
+ '㉞' => '34',
941
+ '㉟' => '35',
942
+ '㉠' => 'ᄀ',
943
+ '㉡' => 'ᄂ',
944
+ '㉢' => 'ᄃ',
945
+ '㉣' => 'ᄅ',
946
+ '㉤' => 'ᄆ',
947
+ '㉥' => 'ᄇ',
948
+ '㉦' => 'ᄉ',
949
+ '㉧' => 'ᄋ',
950
+ '㉨' => 'ᄌ',
951
+ '㉩' => 'ᄎ',
952
+ '㉪' => 'ᄏ',
953
+ '㉫' => 'ᄐ',
954
+ '㉬' => 'ᄑ',
955
+ '㉭' => 'ᄒ',
956
+ '㉮' => '가',
957
+ '㉯' => '나',
958
+ '㉰' => '다',
959
+ '㉱' => '라',
960
+ '㉲' => '마',
961
+ '㉳' => '바',
962
+ '㉴' => '사',
963
+ '㉵' => '아',
964
+ '㉶' => '자',
965
+ '㉷' => '차',
966
+ '㉸' => '카',
967
+ '㉹' => '타',
968
+ '㉺' => '파',
969
+ '㉻' => '하',
970
+ '㉼' => '참고',
971
+ '㉽' => '주의',
972
+ '㉾' => '우',
973
+ '㊀' => '一',
974
+ '㊁' => '二',
975
+ '㊂' => '三',
976
+ '㊃' => '四',
977
+ '㊄' => '五',
978
+ '㊅' => '六',
979
+ '㊆' => '七',
980
+ '㊇' => '八',
981
+ '㊈' => '九',
982
+ '㊉' => '十',
983
+ '㊊' => '月',
984
+ '㊋' => '火',
985
+ '㊌' => '水',
986
+ '㊍' => '木',
987
+ '㊎' => '金',
988
+ '㊏' => '土',
989
+ '㊐' => '日',
990
+ '㊑' => '株',
991
+ '㊒' => '有',
992
+ '㊓' => '社',
993
+ '㊔' => '名',
994
+ '㊕' => '特',
995
+ '㊖' => '財',
996
+ '㊗' => '祝',
997
+ '㊘' => '労',
998
+ '㊙' => '秘',
999
+ '㊚' => '男',
1000
+ '㊛' => '女',
1001
+ '㊜' => '適',
1002
+ '㊝' => '優',
1003
+ '㊞' => '印',
1004
+ '㊟' => '注',
1005
+ '㊠' => '項',
1006
+ '㊡' => '休',
1007
+ '㊢' => '写',
1008
+ '㊣' => '正',
1009
+ '㊤' => '上',
1010
+ '㊥' => '中',
1011
+ '㊦' => '下',
1012
+ '㊧' => '左',
1013
+ '㊨' => '右',
1014
+ '㊩' => '医',
1015
+ '㊪' => '宗',
1016
+ '㊫' => '学',
1017
+ '㊬' => '監',
1018
+ '㊭' => '企',
1019
+ '㊮' => '資',
1020
+ '㊯' => '協',
1021
+ '㊰' => '夜',
1022
+ '㊱' => '36',
1023
+ '㊲' => '37',
1024
+ '㊳' => '38',
1025
+ '㊴' => '39',
1026
+ '㊵' => '40',
1027
+ '㊶' => '41',
1028
+ '㊷' => '42',
1029
+ '㊸' => '43',
1030
+ '㊹' => '44',
1031
+ '㊺' => '45',
1032
+ '㊻' => '46',
1033
+ '㊼' => '47',
1034
+ '㊽' => '48',
1035
+ '㊾' => '49',
1036
+ '㊿' => '50',
1037
+ '㋀' => '1月',
1038
+ '㋁' => '2月',
1039
+ '㋂' => '3月',
1040
+ '㋃' => '4月',
1041
+ '㋄' => '5月',
1042
+ '㋅' => '6月',
1043
+ '㋆' => '7月',
1044
+ '㋇' => '8月',
1045
+ '㋈' => '9月',
1046
+ '㋉' => '10月',
1047
+ '㋊' => '11月',
1048
+ '㋋' => '12月',
1049
+ '㋌' => 'Hg',
1050
+ '㋍' => 'erg',
1051
+ '㋎' => 'eV',
1052
+ '㋏' => 'LTD',
1053
+ '㋐' => 'ア',
1054
+ '㋑' => 'イ',
1055
+ '㋒' => 'ウ',
1056
+ '㋓' => 'エ',
1057
+ '㋔' => 'オ',
1058
+ '㋕' => 'カ',
1059
+ '㋖' => 'キ',
1060
+ '㋗' => 'ク',
1061
+ '㋘' => 'ケ',
1062
+ '㋙' => 'コ',
1063
+ '㋚' => 'サ',
1064
+ '㋛' => 'シ',
1065
+ '㋜' => 'ス',
1066
+ '㋝' => 'セ',
1067
+ '㋞' => 'ソ',
1068
+ '㋟' => 'タ',
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
+ '㌾' => 'ボルト',
1164
+ '㌿' => 'ホン',
1165
+ '㍀' => 'ポンド',
1166
+ '㍁' => 'ホール',
1167
+ '㍂' => 'ホーン',
1168
+ '㍃' => 'マイクロ',
1169
+ '㍄' => 'マイル',
1170
+ '㍅' => 'マッハ',
1171
+ '㍆' => 'マルク',
1172
+ '㍇' => 'マンション',
1173
+ '㍈' => 'ミクロン',
1174
+ '㍉' => 'ミリ',
1175
+ '㍊' => 'ミリバール',
1176
+ '㍋' => 'メガ',
1177
+ '㍌' => 'メガトン',
1178
+ '㍍' => 'メートル',
1179
+ '㍎' => 'ヤード',
1180
+ '㍏' => 'ヤール',
1181
+ '㍐' => 'ユアン',
1182
+ '㍑' => 'リットル',
1183
+ '㍒' => 'リラ',
1184
+ '㍓' => 'ルピー',
1185
+ '㍔' => 'ルーブル',
1186
+ '㍕' => 'レム',
1187
+ '㍖' => 'レントゲン',
1188
+ '㍗' => 'ワット',
1189
+ '㍘' => '0点',
1190
+ '㍙' => '1点',
1191
+ '㍚' => '2点',
1192
+ '㍛' => '3点',
1193
+ '㍜' => '4点',
1194
+ '㍝' => '5点',
1195
+ '㍞' => '6点',
1196
+ '㍟' => '7点',
1197
+ '㍠' => '8点',
1198
+ '㍡' => '9点',
1199
+ '㍢' => '10点',
1200
+ '㍣' => '11点',
1201
+ '㍤' => '12点',
1202
+ '㍥' => '13点',
1203
+ '㍦' => '14点',
1204
+ '㍧' => '15点',
1205
+ '㍨' => '16点',
1206
+ '㍩' => '17点',
1207
+ '㍪' => '18点',
1208
+ '㍫' => '19点',
1209
+ '㍬' => '20点',
1210
+ '㍭' => '21点',
1211
+ '㍮' => '22点',
1212
+ '㍯' => '23点',
1213
+ '㍰' => '24点',
1214
+ '㍱' => 'hPa',
1215
+ '㍲' => 'da',
1216
+ '㍳' => 'AU',
1217
+ '㍴' => 'bar',
1218
+ '㍵' => 'oV',
1219
+ '㍶' => 'pc',
1220
+ '㍷' => 'dm',
1221
+ '㍸' => 'dm2',
1222
+ '㍹' => 'dm3',
1223
+ '㍺' => 'IU',
1224
+ '㍻' => '平成',
1225
+ '㍼' => '昭和',
1226
+ '㍽' => '大正',
1227
+ '㍾' => '明治',
1228
+ '㍿' => '株式会社',
1229
+ '㎀' => 'pA',
1230
+ '㎁' => 'nA',
1231
+ '㎂' => 'μA',
1232
+ '㎃' => 'mA',
1233
+ '㎄' => 'kA',
1234
+ '㎅' => 'KB',
1235
+ '㎆' => 'MB',
1236
+ '㎇' => 'GB',
1237
+ '㎈' => 'cal',
1238
+ '㎉' => 'kcal',
1239
+ '㎊' => 'pF',
1240
+ '㎋' => 'nF',
1241
+ '㎌' => 'μF',
1242
+ '㎍' => 'μg',
1243
+ '㎎' => 'mg',
1244
+ '㎏' => 'kg',
1245
+ '㎐' => 'Hz',
1246
+ '㎑' => 'kHz',
1247
+ '㎒' => 'MHz',
1248
+ '㎓' => 'GHz',
1249
+ '㎔' => 'THz',
1250
+ '㎕' => 'μl',
1251
+ '㎖' => 'ml',
1252
+ '㎗' => 'dl',
1253
+ '㎘' => 'kl',
1254
+ '㎙' => 'fm',
1255
+ '㎚' => 'nm',
1256
+ '㎛' => 'μm',
1257
+ '㎜' => 'mm',
1258
+ '㎝' => 'cm',
1259
+ '㎞' => 'km',
1260
+ '㎟' => 'mm2',
1261
+ '㎠' => 'cm2',
1262
+ '㎡' => 'm2',
1263
+ '㎢' => 'km2',
1264
+ '㎣' => 'mm3',
1265
+ '㎤' => 'cm3',
1266
+ '㎥' => 'm3',
1267
+ '㎦' => 'km3',
1268
+ '㎧' => 'm∕s',
1269
+ '㎨' => 'm∕s2',
1270
+ '㎩' => 'Pa',
1271
+ '㎪' => 'kPa',
1272
+ '㎫' => 'MPa',
1273
+ '㎬' => 'GPa',
1274
+ '㎭' => 'rad',
1275
+ '㎮' => 'rad∕s',
1276
+ '㎯' => 'rad∕s2',
1277
+ '㎰' => 'ps',
1278
+ '㎱' => 'ns',
1279
+ '㎲' => 'μs',
1280
+ '㎳' => 'ms',
1281
+ '㎴' => 'pV',
1282
+ '㎵' => 'nV',
1283
+ '㎶' => 'μV',
1284
+ '㎷' => 'mV',
1285
+ '㎸' => 'kV',
1286
+ '㎹' => 'MV',
1287
+ '㎺' => 'pW',
1288
+ '㎻' => 'nW',
1289
+ '㎼' => 'μW',
1290
+ '㎽' => 'mW',
1291
+ '㎾' => 'kW',
1292
+ '㎿' => 'MW',
1293
+ '㏀' => 'kΩ',
1294
+ '㏁' => 'MΩ',
1295
+ '㏂' => 'a.m.',
1296
+ '㏃' => 'Bq',
1297
+ '㏄' => 'cc',
1298
+ '㏅' => 'cd',
1299
+ '㏆' => 'C∕kg',
1300
+ '㏇' => 'Co.',
1301
+ '㏈' => 'dB',
1302
+ '㏉' => 'Gy',
1303
+ '㏊' => 'ha',
1304
+ '㏋' => 'HP',
1305
+ '㏌' => 'in',
1306
+ '㏍' => 'KK',
1307
+ '㏎' => 'KM',
1308
+ '㏏' => 'kt',
1309
+ '㏐' => 'lm',
1310
+ '㏑' => 'ln',
1311
+ '㏒' => 'log',
1312
+ '㏓' => 'lx',
1313
+ '㏔' => 'mb',
1314
+ '㏕' => 'mil',
1315
+ '㏖' => 'mol',
1316
+ '㏗' => 'PH',
1317
+ '㏘' => 'p.m.',
1318
+ '㏙' => 'PPM',
1319
+ '㏚' => 'PR',
1320
+ '㏛' => 'sr',
1321
+ '㏜' => 'Sv',
1322
+ '㏝' => 'Wb',
1323
+ '㏞' => 'V∕m',
1324
+ '㏟' => 'A∕m',
1325
+ '㏠' => '1日',
1326
+ '㏡' => '2日',
1327
+ '㏢' => '3日',
1328
+ '㏣' => '4日',
1329
+ '㏤' => '5日',
1330
+ '㏥' => '6日',
1331
+ '㏦' => '7日',
1332
+ '㏧' => '8日',
1333
+ '㏨' => '9日',
1334
+ '㏩' => '10日',
1335
+ '㏪' => '11日',
1336
+ '㏫' => '12日',
1337
+ '㏬' => '13日',
1338
+ '㏭' => '14日',
1339
+ '㏮' => '15日',
1340
+ '㏯' => '16日',
1341
+ '㏰' => '17日',
1342
+ '㏱' => '18日',
1343
+ '㏲' => '19日',
1344
+ '㏳' => '20日',
1345
+ '㏴' => '21日',
1346
+ '㏵' => '22日',
1347
+ '㏶' => '23日',
1348
+ '㏷' => '24日',
1349
+ '㏸' => '25日',
1350
+ '㏹' => '26日',
1351
+ '㏺' => '27日',
1352
+ '㏻' => '28日',
1353
+ '㏼' => '29日',
1354
+ '㏽' => '30日',
1355
+ '㏾' => '31日',
1356
+ '㏿' => 'gal',
1357
+ 'ꚜ' => 'ъ',
1358
+ 'ꚝ' => 'ь',
1359
+ 'ꝰ' => 'ꝯ',
1360
+ 'ꟸ' => 'Ħ',
1361
+ 'ꟹ' => 'œ',
1362
+ 'ꭜ' => 'ꜧ',
1363
+ 'ꭝ' => 'ꬷ',
1364
+ 'ꭞ' => 'ɫ',
1365
+ 'ꭟ' => 'ꭒ',
1366
+ 'ꭩ' => 'ʍ',
1367
+ 'ff' => 'ff',
1368
+ 'fi' => 'fi',
1369
+ 'fl' => 'fl',
1370
+ 'ffi' => 'ffi',
1371
+ 'ffl' => 'ffl',
1372
+ 'ſt' => 'st',
1373
+ 'st' => 'st',
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
+ 'ﭨ' => 'ٹ',
1415
+ 'ﭩ' => 'ٹ',
1416
+ 'ﭪ' => 'ڤ',
1417
+ 'ﭫ' => 'ڤ',
1418
+ 'ﭬ' => 'ڤ',
1419
+ 'ﭭ' => 'ڤ',
1420
+ 'ﭮ' => 'ڦ',
1421
+ 'ﭯ' => 'ڦ',
1422
+ 'ﭰ' => 'ڦ',
1423
+ 'ﭱ' => 'ڦ',
1424
+ 'ﭲ' => 'ڄ',
1425
+ 'ﭳ' => 'ڄ',
1426
+ 'ﭴ' => 'ڄ',
1427
+ 'ﭵ' => 'ڄ',
1428
+ 'ﭶ' => 'ڃ',
1429
+ 'ﭷ' => 'ڃ',
1430
+ 'ﭸ' => 'ڃ',
1431
+ 'ﭹ' => 'ڃ',
1432
+ 'ﭺ' => 'چ',
1433
+ 'ﭻ' => 'چ',
1434
+ 'ﭼ' => 'چ',
1435
+ 'ﭽ' => 'چ',
1436
+ 'ﭾ' => 'ڇ',
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
+ 'ﯔ' => 'ڭ',
1490
+ 'ﯕ' => 'ڭ',
1491
+ 'ﯖ' => 'ڭ',
1492
+ 'ﯗ' => 'ۇ',
1493
+ 'ﯘ' => 'ۇ',
1494
+ 'ﯙ' => 'ۆ',
1495
+ 'ﯚ' => 'ۆ',
1496
+ 'ﯛ' => 'ۈ',
1497
+ 'ﯜ' => 'ۈ',
1498
+ 'ﯝ' => 'ۇٴ',
1499
+ 'ﯞ' => 'ۋ',
1500
+ 'ﯟ' => 'ۋ',
1501
+ 'ﯠ' => 'ۅ',
1502
+ 'ﯡ' => 'ۅ',
1503
+ 'ﯢ' => 'ۉ',
1504
+ 'ﯣ' => 'ۉ',
1505
+ 'ﯤ' => 'ې',
1506
+ 'ﯥ' => 'ې',
1507
+ 'ﯦ' => 'ې',
1508
+ 'ﯧ' => 'ې',
1509
+ 'ﯨ' => 'ى',
1510
+ 'ﯩ' => 'ى',
1511
+ 'ﯪ' => 'ئا',
1512
+ 'ﯫ' => 'ئا',
1513
+ 'ﯬ' => 'ئە',
1514
+ 'ﯭ' => 'ئە',
1515
+ 'ﯮ' => 'ئو',
1516
+ 'ﯯ' => 'ئو',
1517
+ 'ﯰ' => 'ئۇ',
1518
+ 'ﯱ' => 'ئۇ',
1519
+ 'ﯲ' => 'ئۆ',
1520
+ 'ﯳ' => 'ئۆ',
1521
+ 'ﯴ' => 'ئۈ',
1522
+ 'ﯵ' => 'ئۈ',
1523
+ 'ﯶ' => 'ئې',
1524
+ 'ﯷ' => 'ئې',
1525
+ 'ﯸ' => 'ئې',
1526
+ 'ﯹ' => 'ئى',
1527
+ 'ﯺ' => 'ئى',
1528
+ 'ﯻ' => 'ئى',
1529
+ 'ﯼ' => 'ی',
1530
+ 'ﯽ' => 'ی',
1531
+ 'ﯾ' => 'ی',
1532
+ 'ﯿ' => 'ی',
1533
+ 'ﰀ' => 'ئج',
1534
+ 'ﰁ' => 'ئح',
1535
+ 'ﰂ' => 'ئم',
1536
+ 'ﰃ' => 'ئى',
1537
+ 'ﰄ' => 'ئي',
1538
+ 'ﰅ' => 'بج',
1539
+ 'ﰆ' => 'بح',
1540
+ 'ﰇ' => 'بخ',
1541
+ 'ﰈ' => 'بم',
1542
+ 'ﰉ' => 'بى',
1543
+ 'ﰊ' => 'بي',
1544
+ 'ﰋ' => 'تج',
1545
+ 'ﰌ' => 'تح',
1546
+ 'ﰍ' => 'تخ',
1547
+ 'ﰎ' => 'تم',
1548
+ 'ﰏ' => 'تى',
1549
+ 'ﰐ' => 'تي',
1550
+ 'ﰑ' => 'ثج',
1551
+ 'ﰒ' => 'ثم',
1552
+ 'ﰓ' => 'ثى',
1553
+ 'ﰔ' => 'ثي',
1554
+ 'ﰕ' => 'جح',
1555
+ 'ﰖ' => 'جم',
1556
+ 'ﰗ' => 'حج',
1557
+ 'ﰘ' => 'حم',
1558
+ 'ﰙ' => 'خج',
1559
+ 'ﰚ' => 'خح',
1560
+ 'ﰛ' => 'خم',
1561
+ 'ﰜ' => 'سج',
1562
+ 'ﰝ' => 'سح',
1563
+ 'ﰞ' => 'سخ',
1564
+ 'ﰟ' => 'سم',
1565
+ 'ﰠ' => 'صح',
1566
+ 'ﰡ' => 'صم',
1567
+ 'ﰢ' => 'ضج',
1568
+ 'ﰣ' => 'ضح',
1569
+ 'ﰤ' => 'ضخ',
1570
+ 'ﰥ' => 'ضم',
1571
+ 'ﰦ' => 'طح',
1572
+ 'ﰧ' => 'طم',
1573
+ 'ﰨ' => 'ظم',
1574
+ 'ﰩ' => 'عج',
1575
+ 'ﰪ' => 'عم',
1576
+ 'ﰫ' => 'غج',
1577
+ 'ﰬ' => 'غم',
1578
+ 'ﰭ' => 'فج',
1579
+ 'ﰮ' => 'فح',
1580
+ 'ﰯ' => 'فخ',
1581
+ 'ﰰ' => 'فم',
1582
+ 'ﰱ' => 'فى',
1583
+ 'ﰲ' => 'في',
1584
+ 'ﰳ' => 'قح',
1585
+ 'ﰴ' => 'قم',
1586
+ 'ﰵ' => 'قى',
1587
+ 'ﰶ' => 'قي',
1588
+ 'ﰷ' => 'كا',
1589
+ 'ﰸ' => 'كج',
1590
+ 'ﰹ' => 'كح',
1591
+ 'ﰺ' => 'كخ',
1592
+ 'ﰻ' => 'كل',
1593
+ 'ﰼ' => 'كم',
1594
+ 'ﰽ' => 'كى',
1595
+ 'ﰾ' => 'كي',
1596
+ 'ﰿ' => 'لج',
1597
+ 'ﱀ' => 'لح',
1598
+ 'ﱁ' => 'لخ',
1599
+ 'ﱂ' => 'لم',
1600
+ 'ﱃ' => 'لى',
1601
+ 'ﱄ' => 'لي',
1602
+ 'ﱅ' => 'مج',
1603
+ 'ﱆ' => 'مح',
1604
+ 'ﱇ' => 'مخ',
1605
+ 'ﱈ' => 'مم',
1606
+ 'ﱉ' => 'مى',
1607
+ 'ﱊ' => 'مي',
1608
+ 'ﱋ' => 'نج',
1609
+ 'ﱌ' => 'نح',
1610
+ 'ﱍ' => 'نخ',
1611
+ 'ﱎ' => 'نم',
1612
+ 'ﱏ' => 'نى',
1613
+ 'ﱐ' => 'ني',
1614
+ 'ﱑ' => 'هج',
1615
+ 'ﱒ' => 'هم',
1616
+ 'ﱓ' => 'هى',
1617
+ 'ﱔ' => 'هي',
1618
+ 'ﱕ' => 'يج',
1619
+ 'ﱖ' => 'يح',
1620
+ 'ﱗ' => 'يخ',
1621
+ 'ﱘ' => 'يم',
1622
+ 'ﱙ' => 'يى',
1623
+ 'ﱚ' => 'يي',
1624
+ 'ﱛ' => 'ذٰ',
1625
+ 'ﱜ' => 'رٰ',
1626
+ 'ﱝ' => 'ىٰ',
1627
+ 'ﱞ' => ' ٌّ',
1628
+ 'ﱟ' => ' ٍّ',
1629
+ 'ﱠ' => ' َّ',
1630
+ 'ﱡ' => ' ُّ',
1631
+ 'ﱢ' => ' ِّ',
1632
+ 'ﱣ' => ' ّٰ',
1633
+ 'ﱤ' => 'ئر',
1634
+ 'ﱥ' => 'ئز',
1635
+ 'ﱦ' => 'ئم',
1636
+ 'ﱧ' => 'ئن',
1637
+ 'ﱨ' => 'ئى',
1638
+ 'ﱩ' => 'ئي',
1639
+ 'ﱪ' => 'بر',
1640
+ 'ﱫ' => 'بز',
1641
+ 'ﱬ' => 'بم',
1642
+ 'ﱭ' => 'بن',
1643
+ 'ﱮ' => 'بى',
1644
+ 'ﱯ' => 'بي',
1645
+ 'ﱰ' => 'تر',
1646
+ 'ﱱ' => 'تز',
1647
+ 'ﱲ' => 'تم',
1648
+ 'ﱳ' => 'تن',
1649
+ 'ﱴ' => 'تى',
1650
+ 'ﱵ' => 'تي',
1651
+ 'ﱶ' => 'ثر',
1652
+ 'ﱷ' => 'ثز',
1653
+ 'ﱸ' => 'ثم',
1654
+ 'ﱹ' => 'ثن',
1655
+ 'ﱺ' => 'ثى',
1656
+ 'ﱻ' => 'ثي',
1657
+ 'ﱼ' => 'فى',
1658
+ 'ﱽ' => 'في',
1659
+ 'ﱾ' => 'قى',
1660
+ 'ﱿ' => 'قي',
1661
+ 'ﲀ' => 'كا',
1662
+ 'ﲁ' => 'كل',
1663
+ 'ﲂ' => 'كم',
1664
+ 'ﲃ' => 'كى',
1665
+ 'ﲄ' => 'كي',
1666
+ 'ﲅ' => 'لم',
1667
+ 'ﲆ' => 'لى',
1668
+ 'ﲇ' => 'لي',
1669
+ 'ﲈ' => 'ما',
1670
+ 'ﲉ' => 'مم',
1671
+ 'ﲊ' => 'نر',
1672
+ 'ﲋ' => 'نز',
1673
+ 'ﲌ' => 'نم',
1674
+ 'ﲍ' => 'نن',
1675
+ 'ﲎ' => 'نى',
1676
+ 'ﲏ' => 'ني',
1677
+ 'ﲐ' => 'ىٰ',
1678
+ 'ﲑ' => 'ير',
1679
+ 'ﲒ' => 'يز',
1680
+ 'ﲓ' => 'يم',
1681
+ 'ﲔ' => 'ين',
1682
+ 'ﲕ' => 'يى',
1683
+ 'ﲖ' => 'يي',
1684
+ 'ﲗ' => 'ئج',
1685
+ 'ﲘ' => 'ئح',
1686
+ 'ﲙ' => 'ئخ',
1687
+ 'ﲚ' => 'ئم',
1688
+ 'ﲛ' => 'ئه',
1689
+ 'ﲜ' => 'بج',
1690
+ 'ﲝ' => 'بح',
1691
+ 'ﲞ' => 'بخ',
1692
+ 'ﲟ' => 'بم',
1693
+ 'ﲠ' => 'به',
1694
+ 'ﲡ' => 'تج',
1695
+ 'ﲢ' => 'تح',
1696
+ 'ﲣ' => 'تخ',
1697
+ 'ﲤ' => 'تم',
1698
+ 'ﲥ' => 'ته',
1699
+ 'ﲦ' => 'ثم',
1700
+ 'ﲧ' => 'جح',
1701
+ 'ﲨ' => 'جم',
1702
+ 'ﲩ' => 'حج',
1703
+ 'ﲪ' => 'حم',
1704
+ 'ﲫ' => 'خج',
1705
+ 'ﲬ' => 'خم',
1706
+ 'ﲭ' => 'سج',
1707
+ 'ﲮ' => 'سح',
1708
+ 'ﲯ' => 'سخ',
1709
+ 'ﲰ' => 'سم',
1710
+ 'ﲱ' => 'صح',
1711
+ 'ﲲ' => 'صخ',
1712
+ 'ﲳ' => 'صم',
1713
+ 'ﲴ' => 'ضج',
1714
+ 'ﲵ' => 'ضح',
1715
+ 'ﲶ' => 'ضخ',
1716
+ 'ﲷ' => 'ضم',
1717
+ 'ﲸ' => 'طح',
1718
+ 'ﲹ' => 'ظم',
1719
+ 'ﲺ' => 'عج',
1720
+ 'ﲻ' => 'عم',
1721
+ 'ﲼ' => 'غج',
1722
+ 'ﲽ' => 'غم',
1723
+ 'ﲾ' => 'فج',
1724
+ 'ﲿ' => 'فح',
1725
+ 'ﳀ' => 'فخ',
1726
+ 'ﳁ' => 'فم',
1727
+ 'ﳂ' => 'قح',
1728
+ 'ﳃ' => 'قم',
1729
+ 'ﳄ' => 'كج',
1730
+ 'ﳅ' => 'كح',
1731
+ 'ﳆ' => 'كخ',
1732
+ 'ﳇ' => 'كل',
1733
+ 'ﳈ' => 'كم',
1734
+ 'ﳉ' => 'لج',
1735
+ 'ﳊ' => 'لح',
1736
+ 'ﳋ' => 'لخ',
1737
+ 'ﳌ' => 'لم',
1738
+ 'ﳍ' => 'له',
1739
+ 'ﳎ' => 'مج',
1740
+ 'ﳏ' => 'مح',
1741
+ 'ﳐ' => 'مخ',
1742
+ 'ﳑ' => 'مم',
1743
+ 'ﳒ' => 'نج',
1744
+ 'ﳓ' => 'نح',
1745
+ 'ﳔ' => 'نخ',
1746
+ 'ﳕ' => 'نم',
1747
+ 'ﳖ' => 'نه',
1748
+ 'ﳗ' => 'هج',
1749
+ 'ﳘ' => 'هم',
1750
+ 'ﳙ' => 'هٰ',
1751
+ 'ﳚ' => 'يج',
1752
+ 'ﳛ' => 'يح',
1753
+ 'ﳜ' => 'يخ',
1754
+ 'ﳝ' => 'يم',
1755
+ 'ﳞ' => 'يه',
1756
+ 'ﳟ' => 'ئم',
1757
+ 'ﳠ' => 'ئه',
1758
+ 'ﳡ' => 'بم',
1759
+ 'ﳢ' => 'به',
1760
+ 'ﳣ' => 'تم',
1761
+ 'ﳤ' => 'ته',
1762
+ 'ﳥ' => 'ثم',
1763
+ 'ﳦ' => 'ثه',
1764
+ 'ﳧ' => 'سم',
1765
+ 'ﳨ' => 'سه',
1766
+ 'ﳩ' => 'شم',
1767
+ 'ﳪ' => 'شه',
1768
+ 'ﳫ' => 'كل',
1769
+ 'ﳬ' => 'كم',
1770
+ 'ﳭ' => 'لم',
1771
+ 'ﳮ' => 'نم',
1772
+ 'ﳯ' => 'نه',
1773
+ 'ﳰ' => 'يم',
1774
+ 'ﳱ' => 'يه',
1775
+ 'ﳲ' => 'ـَّ',
1776
+ 'ﳳ' => 'ـُّ',
1777
+ 'ﳴ' => 'ـِّ',
1778
+ 'ﳵ' => 'طى',
1779
+ 'ﳶ' => 'طي',
1780
+ 'ﳷ' => 'عى',
1781
+ 'ﳸ' => 'عي',
1782
+ 'ﳹ' => 'غى',
1783
+ 'ﳺ' => 'غي',
1784
+ 'ﳻ' => 'سى',
1785
+ 'ﳼ' => 'سي',
1786
+ 'ﳽ' => 'شى',
1787
+ 'ﳾ' => 'شي',
1788
+ 'ﳿ' => 'حى',
1789
+ 'ﴀ' => 'حي',
1790
+ 'ﴁ' => 'جى',
1791
+ 'ﴂ' => 'جي',
1792
+ 'ﴃ' => 'خى',
1793
+ 'ﴄ' => 'خي',
1794
+ 'ﴅ' => 'صى',
1795
+ 'ﴆ' => 'صي',
1796
+ 'ﴇ' => 'ضى',
1797
+ 'ﴈ' => 'ضي',
1798
+ 'ﴉ' => 'شج',
1799
+ 'ﴊ' => 'شح',
1800
+ 'ﴋ' => 'شخ',
1801
+ 'ﴌ' => 'شم',
1802
+ 'ﴍ' => 'شر',
1803
+ 'ﴎ' => 'سر',
1804
+ 'ﴏ' => 'صر',
1805
+ 'ﴐ' => 'ضر',
1806
+ 'ﴑ' => 'طى',
1807
+ 'ﴒ' => 'طي',
1808
+ 'ﴓ' => 'عى',
1809
+ 'ﴔ' => 'عي',
1810
+ 'ﴕ' => 'غى',
1811
+ 'ﴖ' => 'غي',
1812
+ 'ﴗ' => 'سى',
1813
+ 'ﴘ' => 'سي',
1814
+ 'ﴙ' => 'شى',
1815
+ 'ﴚ' => 'شي',
1816
+ 'ﴛ' => 'حى',
1817
+ 'ﴜ' => 'حي',
1818
+ 'ﴝ' => 'جى',
1819
+ 'ﴞ' => 'جي',
1820
+ 'ﴟ' => 'خى',
1821
+ 'ﴠ' => 'خي',
1822
+ 'ﴡ' => 'صى',
1823
+ 'ﴢ' => 'صي',
1824
+ 'ﴣ' => 'ضى',
1825
+ 'ﴤ' => 'ضي',
1826
+ 'ﴥ' => 'شج',
1827
+ 'ﴦ' => 'شح',
1828
+ 'ﴧ' => 'شخ',
1829
+ 'ﴨ' => 'شم',
1830
+ 'ﴩ' => 'شر',
1831
+ 'ﴪ' => 'سر',
1832
+ 'ﴫ' => 'صر',
1833
+ 'ﴬ' => 'ضر',
1834
+ 'ﴭ' => 'شج',
1835
+ 'ﴮ' => 'شح',
1836
+ 'ﴯ' => 'شخ',
1837
+ 'ﴰ' => 'شم',
1838
+ 'ﴱ' => 'سه',
1839
+ 'ﴲ' => 'شه',
1840
+ 'ﴳ' => 'طم',
1841
+ 'ﴴ' => 'سج',
1842
+ 'ﴵ' => 'سح',
1843
+ 'ﴶ' => 'سخ',
1844
+ 'ﴷ' => 'شج',
1845
+ 'ﴸ' => 'شح',
1846
+ 'ﴹ' => 'شخ',
1847
+ 'ﴺ' => 'طم',
1848
+ 'ﴻ' => 'ظم',
1849
+ 'ﴼ' => 'اً',
1850
+ 'ﴽ' => 'اً',
1851
+ 'ﵐ' => 'تجم',
1852
+ 'ﵑ' => 'تحج',
1853
+ 'ﵒ' => 'تحج',
1854
+ 'ﵓ' => 'تحم',
1855
+ 'ﵔ' => 'تخم',
1856
+ 'ﵕ' => 'تمج',
1857
+ 'ﵖ' => 'تمح',
1858
+ 'ﵗ' => 'تمخ',
1859
+ 'ﵘ' => 'جمح',
1860
+ 'ﵙ' => 'جمح',
1861
+ 'ﵚ' => 'حمي',
1862
+ 'ﵛ' => 'حمى',
1863
+ 'ﵜ' => 'سحج',
1864
+ 'ﵝ' => 'سجح',
1865
+ 'ﵞ' => 'سجى',
1866
+ 'ﵟ' => 'سمح',
1867
+ 'ﵠ' => 'سمح',
1868
+ 'ﵡ' => 'سمج',
1869
+ 'ﵢ' => 'سمم',
1870
+ 'ﵣ' => 'سمم',
1871
+ 'ﵤ' => 'صحح',
1872
+ 'ﵥ' => 'صحح',
1873
+ 'ﵦ' => 'صمم',
1874
+ 'ﵧ' => 'شحم',
1875
+ 'ﵨ' => 'شحم',
1876
+ 'ﵩ' => 'شجي',
1877
+ 'ﵪ' => 'شمخ',
1878
+ 'ﵫ' => 'شمخ',
1879
+ 'ﵬ' => 'شمم',
1880
+ 'ﵭ' => 'شمم',
1881
+ 'ﵮ' => 'ضحى',
1882
+ 'ﵯ' => 'ضخم',
1883
+ 'ﵰ' => 'ضخم',
1884
+ 'ﵱ' => 'طمح',
1885
+ 'ﵲ' => 'طمح',
1886
+ 'ﵳ' => 'طمم',
1887
+ 'ﵴ' => 'طمي',
1888
+ 'ﵵ' => 'عجم',
1889
+ 'ﵶ' => 'عمم',
1890
+ 'ﵷ' => 'عمم',
1891
+ 'ﵸ' => 'عمى',
1892
+ 'ﵹ' => 'غمم',
1893
+ 'ﵺ' => 'غمي',
1894
+ 'ﵻ' => 'غمى',
1895
+ 'ﵼ' => 'فخم',
1896
+ 'ﵽ' => 'فخم',
1897
+ 'ﵾ' => 'قمح',
1898
+ 'ﵿ' => 'قمم',
1899
+ 'ﶀ' => 'لحم',
1900
+ 'ﶁ' => 'لحي',
1901
+ 'ﶂ' => 'لحى',
1902
+ 'ﶃ' => 'لجج',
1903
+ 'ﶄ' => 'لجج',
1904
+ 'ﶅ' => 'لخم',
1905
+ 'ﶆ' => 'لخم',
1906
+ 'ﶇ' => 'لمح',
1907
+ 'ﶈ' => 'لمح',
1908
+ 'ﶉ' => 'محج',
1909
+ 'ﶊ' => 'محم',
1910
+ 'ﶋ' => 'محي',
1911
+ 'ﶌ' => 'مجح',
1912
+ 'ﶍ' => 'مجم',
1913
+ 'ﶎ' => 'مخج',
1914
+ 'ﶏ' => 'مخم',
1915
+ 'ﶒ' => 'مجخ',
1916
+ 'ﶓ' => 'همج',
1917
+ 'ﶔ' => 'همم',
1918
+ 'ﶕ' => 'نحم',
1919
+ 'ﶖ' => 'نحى',
1920
+ 'ﶗ' => 'نجم',
1921
+ 'ﶘ' => 'نجم',
1922
+ 'ﶙ' => 'نجى',
1923
+ 'ﶚ' => 'نمي',
1924
+ 'ﶛ' => 'نمى',
1925
+ 'ﶜ' => 'يمم',
1926
+ 'ﶝ' => 'يمم',
1927
+ 'ﶞ' => 'بخي',
1928
+ 'ﶟ' => 'تجي',
1929
+ 'ﶠ' => 'تجى',
1930
+ 'ﶡ' => 'تخي',
1931
+ 'ﶢ' => 'تخى',
1932
+ 'ﶣ' => 'تمي',
1933
+ 'ﶤ' => 'تمى',
1934
+ 'ﶥ' => 'جمي',
1935
+ 'ﶦ' => 'جحى',
1936
+ 'ﶧ' => 'جمى',
1937
+ 'ﶨ' => 'سخى',
1938
+ 'ﶩ' => 'صحي',
1939
+ 'ﶪ' => 'شحي',
1940
+ 'ﶫ' => 'ضحي',
1941
+ 'ﶬ' => 'لجي',
1942
+ 'ﶭ' => 'لمي',
1943
+ 'ﶮ' => 'يحي',
1944
+ 'ﶯ' => 'يجي',
1945
+ 'ﶰ' => 'يمي',
1946
+ 'ﶱ' => 'ممي',
1947
+ 'ﶲ' => 'قمي',
1948
+ 'ﶳ' => 'نحي',
1949
+ 'ﶴ' => 'قمح',
1950
+ 'ﶵ' => 'لحم',
1951
+ 'ﶶ' => 'عمي',
1952
+ 'ﶷ' => 'كمي',
1953
+ 'ﶸ' => 'نجح',
1954
+ 'ﶹ' => 'مخي',
1955
+ 'ﶺ' => 'لجم',
1956
+ 'ﶻ' => 'كمم',
1957
+ 'ﶼ' => 'لجم',
1958
+ 'ﶽ' => 'نجح',
1959
+ 'ﶾ' => 'جحي',
1960
+ 'ﶿ' => 'حجي',
1961
+ 'ﷀ' => 'مجي',
1962
+ 'ﷁ' => 'فمي',
1963
+ 'ﷂ' => 'بحي',
1964
+ 'ﷃ' => 'كمم',
1965
+ 'ﷄ' => 'عجم',
1966
+ 'ﷅ' => 'صمم',
1967
+ 'ﷆ' => 'سخي',
1968
+ 'ﷇ' => 'نجي',
1969
+ 'ﷰ' => 'صلے',
1970
+ 'ﷱ' => 'قلے',
1971
+ 'ﷲ' => 'الله',
1972
+ 'ﷳ' => 'اكبر',
1973
+ 'ﷴ' => 'محمد',
1974
+ 'ﷵ' => 'صلعم',
1975
+ 'ﷶ' => 'رسول',
1976
+ 'ﷷ' => 'عليه',
1977
+ 'ﷸ' => 'وسلم',
1978
+ 'ﷹ' => 'صلى',
1979
+ 'ﷺ' => 'صلى الله عليه وسلم',
1980
+ 'ﷻ' => 'جل جلاله',
1981
+ '﷼' => 'ریال',
1982
+ '︐' => ',',
1983
+ '︑' => '、',
1984
+ '︒' => '。',
1985
+ '︓' => ':',
1986
+ '︔' => ';',
1987
+ '︕' => '!',
1988
+ '︖' => '?',
1989
+ '︗' => '〖',
1990
+ '︘' => '〗',
1991
+ '︙' => '...',
1992
+ '︰' => '..',
1993
+ '︱' => '—',
1994
+ '︲' => '–',
1995
+ '︳' => '_',
1996
+ '︴' => '_',
1997
+ '︵' => '(',
1998
+ '︶' => ')',
1999
+ '︷' => '{',
2000
+ '︸' => '}',
2001
+ '︹' => '〔',
2002
+ '︺' => '〕',
2003
+ '︻' => '【',
2004
+ '︼' => '】',
2005
+ '︽' => '《',
2006
+ '︾' => '》',
2007
+ '︿' => '〈',
2008
+ '﹀' => '〉',
2009
+ '﹁' => '「',
2010
+ '﹂' => '」',
2011
+ '﹃' => '『',
2012
+ '﹄' => '』',
2013
+ '﹇' => '[',
2014
+ '﹈' => ']',
2015
+ '﹉' => ' ̅',
2016
+ '﹊' => ' ̅',
2017
+ '﹋' => ' ̅',
2018
+ '﹌' => ' ̅',
2019
+ '﹍' => '_',
2020
+ '﹎' => '_',
2021
+ '﹏' => '_',
2022
+ '﹐' => ',',
2023
+ '﹑' => '、',
2024
+ '﹒' => '.',
2025
+ '﹔' => ';',
2026
+ '﹕' => ':',
2027
+ '﹖' => '?',
2028
+ '﹗' => '!',
2029
+ '﹘' => '—',
2030
+ '﹙' => '(',
2031
+ '﹚' => ')',
2032
+ '﹛' => '{',
2033
+ '﹜' => '}',
2034
+ '﹝' => '〔',
2035
+ '﹞' => '〕',
2036
+ '﹟' => '#',
2037
+ '﹠' => '&',
2038
+ '﹡' => '*',
2039
+ '﹢' => '+',
2040
+ '﹣' => '-',
2041
+ '﹤' => '<',
2042
+ '﹥' => '>',
2043
+ '﹦' => '=',
2044
+ '﹨' => '\\',
2045
+ '﹩' => '$',
2046
+ '﹪' => '%',
2047
+ '﹫' => '@',
2048
+ 'ﹰ' => ' ً',
2049
+ 'ﹱ' => 'ـً',
2050
+ 'ﹲ' => ' ٌ',
2051
+ 'ﹴ' => ' ٍ',
2052
+ 'ﹶ' => ' َ',
2053
+ 'ﹷ' => 'ـَ',
2054
+ 'ﹸ' => ' ُ',
2055
+ 'ﹹ' => 'ـُ',
2056
+ 'ﹺ' => ' ِ',
2057
+ 'ﹻ' => 'ـِ',
2058
+ 'ﹼ' => ' ّ',
2059
+ 'ﹽ' => 'ـّ',
2060
+ 'ﹾ' => ' ْ',
2061
+ 'ﹿ' => 'ـْ',
2062
+ 'ﺀ' => 'ء',
2063
+ 'ﺁ' => 'آ',
2064
+ 'ﺂ' => 'آ',
2065
+ 'ﺃ' => 'أ',
2066
+ 'ﺄ' => 'أ',
2067
+ 'ﺅ' => 'ؤ',
2068
+ 'ﺆ' => 'ؤ',
2069
+ 'ﺇ' => 'إ',
2070
+ 'ﺈ' => 'إ',
2071
+ 'ﺉ' => 'ئ',
2072
+ 'ﺊ' => 'ئ',
2073
+ 'ﺋ' => 'ئ',
2074
+ 'ﺌ' => 'ئ',
2075
+ 'ﺍ' => 'ا',
2076
+ 'ﺎ' => 'ا',
2077
+ 'ﺏ' => 'ب',
2078
+ 'ﺐ' => 'ب',
2079
+ 'ﺑ' => 'ب',
2080
+ 'ﺒ' => 'ب',
2081
+ 'ﺓ' => 'ة',
2082
+ 'ﺔ' => 'ة',
2083
+ 'ﺕ' => 'ت',
2084
+ 'ﺖ' => 'ت',
2085
+ 'ﺗ' => 'ت',
2086
+ 'ﺘ' => 'ت',
2087
+ 'ﺙ' => 'ث',
2088
+ 'ﺚ' => 'ث',
2089
+ 'ﺛ' => 'ث',
2090
+ 'ﺜ' => 'ث',
2091
+ 'ﺝ' => 'ج',
2092
+ 'ﺞ' => 'ج',
2093
+ 'ﺟ' => 'ج',
2094
+ 'ﺠ' => 'ج',
2095
+ 'ﺡ' => 'ح',
2096
+ 'ﺢ' => 'ح',
2097
+ 'ﺣ' => 'ح',
2098
+ 'ﺤ' => 'ح',
2099
+ 'ﺥ' => 'خ',
2100
+ 'ﺦ' => 'خ',
2101
+ 'ﺧ' => 'خ',
2102
+ 'ﺨ' => 'خ',
2103
+ 'ﺩ' => 'د',
2104
+ 'ﺪ' => 'د',
2105
+ 'ﺫ' => 'ذ',
2106
+ 'ﺬ' => 'ذ',
2107
+ 'ﺭ' => 'ر',
2108
+ 'ﺮ' => 'ر',
2109
+ 'ﺯ' => 'ز',
2110
+ 'ﺰ' => 'ز',
2111
+ 'ﺱ' => 'س',
2112
+ 'ﺲ' => 'س',
2113
+ 'ﺳ' => 'س',
2114
+ 'ﺴ' => 'س',
2115
+ 'ﺵ' => 'ش',
2116
+ 'ﺶ' => 'ش',
2117
+ 'ﺷ' => 'ش',
2118
+ 'ﺸ' => 'ش',
2119
+ 'ﺹ' => 'ص',
2120
+ 'ﺺ' => 'ص',
2121
+ 'ﺻ' => 'ص',
2122
+ 'ﺼ' => 'ص',
2123
+ 'ﺽ' => 'ض',
2124
+ 'ﺾ' => 'ض',
2125
+ 'ﺿ' => 'ض',
2126
+ 'ﻀ' => 'ض',
2127
+ 'ﻁ' => 'ط',
2128
+ 'ﻂ' => 'ط',
2129
+ 'ﻃ' => 'ط',
2130
+ 'ﻄ' => 'ط',
2131
+ 'ﻅ' => 'ظ',
2132
+ 'ﻆ' => 'ظ',
2133
+ 'ﻇ' => 'ظ',
2134
+ 'ﻈ' => 'ظ',
2135
+ 'ﻉ' => 'ع',
2136
+ 'ﻊ' => 'ع',
2137
+ 'ﻋ' => 'ع',
2138
+ 'ﻌ' => 'ع',
2139
+ 'ﻍ' => 'غ',
2140
+ 'ﻎ' => 'غ',
2141
+ 'ﻏ' => 'غ',
2142
+ 'ﻐ' => 'غ',
2143
+ 'ﻑ' => 'ف',
2144
+ 'ﻒ' => 'ف',
2145
+ 'ﻓ' => 'ف',
2146
+ 'ﻔ' => 'ف',
2147
+ 'ﻕ' => 'ق',
2148
+ 'ﻖ' => 'ق',
2149
+ 'ﻗ' => 'ق',
2150
+ 'ﻘ' => 'ق',
2151
+ 'ﻙ' => 'ك',
2152
+ 'ﻚ' => 'ك',
2153
+ 'ﻛ' => 'ك',
2154
+ 'ﻜ' => 'ك',
2155
+ 'ﻝ' => 'ل',
2156
+ 'ﻞ' => 'ل',
2157
+ 'ﻟ' => 'ل',
2158
+ 'ﻠ' => 'ل',
2159
+ 'ﻡ' => 'م',
2160
+ 'ﻢ' => 'م',
2161
+ 'ﻣ' => 'م',
2162
+ 'ﻤ' => 'م',
2163
+ 'ﻥ' => 'ن',
2164
+ 'ﻦ' => 'ن',
2165
+ 'ﻧ' => 'ن',
2166
+ 'ﻨ' => 'ن',
2167
+ 'ﻩ' => 'ه',
2168
+ 'ﻪ' => 'ه',
2169
+ 'ﻫ' => 'ه',
2170
+ 'ﻬ' => 'ه',
2171
+ 'ﻭ' => 'و',
2172
+ 'ﻮ' => 'و',
2173
+ 'ﻯ' => 'ى',
2174
+ 'ﻰ' => 'ى',
2175
+ 'ﻱ' => 'ي',
2176
+ 'ﻲ' => 'ي',
2177
+ 'ﻳ' => 'ي',
2178
+ 'ﻴ' => 'ي',
2179
+ 'ﻵ' => 'لآ',
2180
+ 'ﻶ' => 'لآ',
2181
+ 'ﻷ' => 'لأ',
2182
+ 'ﻸ' => 'لأ',
2183
+ 'ﻹ' => 'لإ',
2184
+ 'ﻺ' => 'لإ',
2185
+ 'ﻻ' => 'لا',
2186
+ 'ﻼ' => 'لا',
2187
+ '!' => '!',
2188
+ '"' => '"',
2189
+ '#' => '#',
2190
+ '$' => '$',
2191
+ '%' => '%',
2192
+ '&' => '&',
2193
+ ''' => '\'',
2194
+ '(' => '(',
2195
+ ')' => ')',
2196
+ '*' => '*',
2197
+ '+' => '+',
2198
+ ',' => ',',
2199
+ '-' => '-',
2200
+ '.' => '.',
2201
+ '/' => '/',
2202
+ '0' => '0',
2203
+ '1' => '1',
2204
+ '2' => '2',
2205
+ '3' => '3',
2206
+ '4' => '4',
2207
+ '5' => '5',
2208
+ '6' => '6',
2209
+ '7' => '7',
2210
+ '8' => '8',
2211
+ '9' => '9',
2212
+ ':' => ':',
2213
+ ';' => ';',
2214
+ '<' => '<',
2215
+ '=' => '=',
2216
+ '>' => '>',
2217
+ '?' => '?',
2218
+ '@' => '@',
2219
+ 'A' => 'A',
2220
+ 'B' => 'B',
2221
+ 'C' => 'C',
2222
+ 'D' => 'D',
2223
+ 'E' => 'E',
2224
+ 'F' => 'F',
2225
+ 'G' => 'G',
2226
+ 'H' => 'H',
2227
+ 'I' => 'I',
2228
+ 'J' => 'J',
2229
+ 'K' => 'K',
2230
+ 'L' => 'L',
2231
+ 'M' => 'M',
2232
+ 'N' => 'N',
2233
+ 'O' => 'O',
2234
+ 'P' => 'P',
2235
+ 'Q' => 'Q',
2236
+ 'R' => 'R',
2237
+ 'S' => 'S',
2238
+ 'T' => 'T',
2239
+ 'U' => 'U',
2240
+ 'V' => 'V',
2241
+ 'W' => 'W',
2242
+ 'X' => 'X',
2243
+ 'Y' => 'Y',
2244
+ 'Z' => 'Z',
2245
+ '[' => '[',
2246
+ '\' => '\\',
2247
+ ']' => ']',
2248
+ '^' => '^',
2249
+ '_' => '_',
2250
+ '`' => '`',
2251
+ 'a' => 'a',
2252
+ 'b' => 'b',
2253
+ 'c' => 'c',
2254
+ 'd' => 'd',
2255
+ 'e' => 'e',
2256
+ 'f' => 'f',
2257
+ 'g' => 'g',
2258
+ 'h' => 'h',
2259
+ 'i' => 'i',
2260
+ 'j' => 'j',
2261
+ 'k' => 'k',
2262
+ 'l' => 'l',
2263
+ 'm' => 'm',
2264
+ 'n' => 'n',
2265
+ 'o' => 'o',
2266
+ 'p' => 'p',
2267
+ 'q' => 'q',
2268
+ 'r' => 'r',
2269
+ 's' => 's',
2270
+ 't' => 't',
2271
+ 'u' => 'u',
2272
+ 'v' => 'v',
2273
+ 'w' => 'w',
2274
+ 'x' => 'x',
2275
+ 'y' => 'y',
2276
+ 'z' => 'z',
2277
+ '{' => '{',
2278
+ '|' => '|',
2279
+ '}' => '}',
2280
+ '~' => '~',
2281
+ '⦅' => '⦅',
2282
+ '⦆' => '⦆',
2283
+ '。' => '。',
2284
+ '「' => '「',
2285
+ '」' => '」',
2286
+ '、' => '、',
2287
+ '・' => '・',
2288
+ 'ヲ' => 'ヲ',
2289
+ 'ァ' => 'ァ',
2290
+ 'ィ' => 'ィ',
2291
+ 'ゥ' => 'ゥ',
2292
+ 'ェ' => 'ェ',
2293
+ 'ォ' => 'ォ',
2294
+ 'ャ' => 'ャ',
2295
+ 'ュ' => 'ュ',
2296
+ 'ョ' => 'ョ',
2297
+ 'ッ' => 'ッ',
2298
+ 'ー' => 'ー',
2299
+ 'ア' => 'ア',
2300
+ 'イ' => 'イ',
2301
+ 'ウ' => 'ウ',
2302
+ 'エ' => 'エ',
2303
+ 'オ' => 'オ',
2304
+ 'カ' => 'カ',
2305
+ 'キ' => 'キ',
2306
+ 'ク' => 'ク',
2307
+ 'ケ' => 'ケ',
2308
+ 'コ' => 'コ',
2309
+ 'サ' => 'サ',
2310
+ 'シ' => 'シ',
2311
+ 'ス' => 'ス',
2312
+ 'セ' => 'セ',
2313
+ 'ソ' => 'ソ',
2314
+ 'タ' => 'タ',
2315
+ 'チ' => 'チ',
2316
+ 'ツ' => 'ツ',
2317
+ 'テ' => 'テ',
2318
+ 'ト' => 'ト',
2319
+ 'ナ' => 'ナ',
2320
+ 'ニ' => 'ニ',
2321
+ 'ヌ' => 'ヌ',
2322
+ 'ネ' => 'ネ',
2323
+ 'ノ' => 'ノ',
2324
+ 'ハ' => 'ハ',
2325
+ 'ヒ' => 'ヒ',
2326
+ 'フ' => 'フ',
2327
+ 'ヘ' => 'ヘ',
2328
+ 'ホ' => 'ホ',
2329
+ 'マ' => 'マ',
2330
+ 'ミ' => 'ミ',
2331
+ 'ム' => 'ム',
2332
+ 'メ' => 'メ',
2333
+ 'モ' => 'モ',
2334
+ 'ヤ' => 'ヤ',
2335
+ 'ユ' => 'ユ',
2336
+ 'ヨ' => 'ヨ',
2337
+ 'ラ' => 'ラ',
2338
+ 'リ' => 'リ',
2339
+ 'ル' => 'ル',
2340
+ 'レ' => 'レ',
2341
+ 'ロ' => 'ロ',
2342
+ 'ワ' => 'ワ',
2343
+ 'ン' => 'ン',
2344
+ '゙' => '゙',
2345
+ '゚' => '゚',
2346
+ 'ᅠ' => 'ᅠ',
2347
+ 'ᄀ' => 'ᄀ',
2348
+ 'ᄁ' => 'ᄁ',
2349
+ 'ᆪ' => 'ᆪ',
2350
+ 'ᄂ' => 'ᄂ',
2351
+ 'ᆬ' => 'ᆬ',
2352
+ 'ᆭ' => 'ᆭ',
2353
+ 'ᄃ' => 'ᄃ',
2354
+ 'ᄄ' => 'ᄄ',
2355
+ 'ᄅ' => 'ᄅ',
2356
+ 'ᆰ' => 'ᆰ',
2357
+ 'ᆱ' => 'ᆱ',
2358
+ 'ᆲ' => 'ᆲ',
2359
+ 'ᆳ' => 'ᆳ',
2360
+ 'ᆴ' => 'ᆴ',
2361
+ 'ᆵ' => 'ᆵ',
2362
+ 'ᄚ' => 'ᄚ',
2363
+ 'ᄆ' => 'ᄆ',
2364
+ 'ᄇ' => 'ᄇ',
2365
+ 'ᄈ' => 'ᄈ',
2366
+ 'ᄡ' => 'ᄡ',
2367
+ 'ᄉ' => 'ᄉ',
2368
+ 'ᄊ' => 'ᄊ',
2369
+ 'ᄋ' => 'ᄋ',
2370
+ 'ᄌ' => 'ᄌ',
2371
+ 'ᄍ' => 'ᄍ',
2372
+ 'ᄎ' => 'ᄎ',
2373
+ 'ᄏ' => 'ᄏ',
2374
+ 'ᄐ' => 'ᄐ',
2375
+ 'ᄑ' => 'ᄑ',
2376
+ 'ᄒ' => 'ᄒ',
2377
+ 'ᅡ' => 'ᅡ',
2378
+ 'ᅢ' => 'ᅢ',
2379
+ 'ᅣ' => 'ᅣ',
2380
+ 'ᅤ' => 'ᅤ',
2381
+ 'ᅥ' => 'ᅥ',
2382
+ 'ᅦ' => 'ᅦ',
2383
+ 'ᅧ' => 'ᅧ',
2384
+ 'ᅨ' => 'ᅨ',
2385
+ 'ᅩ' => 'ᅩ',
2386
+ 'ᅪ' => 'ᅪ',
2387
+ 'ᅫ' => 'ᅫ',
2388
+ 'ᅬ' => 'ᅬ',
2389
+ 'ᅭ' => 'ᅭ',
2390
+ 'ᅮ' => 'ᅮ',
2391
+ 'ᅯ' => 'ᅯ',
2392
+ 'ᅰ' => 'ᅰ',
2393
+ 'ᅱ' => 'ᅱ',
2394
+ 'ᅲ' => 'ᅲ',
2395
+ 'ᅳ' => 'ᅳ',
2396
+ 'ᅴ' => 'ᅴ',
2397
+ 'ᅵ' => 'ᅵ',
2398
+ '¢' => '¢',
2399
+ '£' => '£',
2400
+ '¬' => '¬',
2401
+ ' ̄' => ' ̄',
2402
+ '¦' => '¦',
2403
+ '¥' => '¥',
2404
+ '₩' => '₩',
2405
+ '│' => '│',
2406
+ '←' => '←',
2407
+ '↑' => '↑',
2408
+ '→' => '→',
2409
+ '↓' => '↓',
2410
+ '■' => '■',
2411
+ '○' => '○',
2412
+ '𝐀' => 'A',
2413
+ '𝐁' => 'B',
2414
+ '𝐂' => 'C',
2415
+ '𝐃' => 'D',
2416
+ '𝐄' => 'E',
2417
+ '𝐅' => 'F',
2418
+ '𝐆' => 'G',
2419
+ '𝐇' => 'H',
2420
+ '𝐈' => 'I',
2421
+ '𝐉' => 'J',
2422
+ '𝐊' => 'K',
2423
+ '𝐋' => 'L',
2424
+ '𝐌' => 'M',
2425
+ '𝐍' => 'N',
2426
+ '𝐎' => 'O',
2427
+ '𝐏' => 'P',
2428
+ '𝐐' => 'Q',
2429
+ '𝐑' => 'R',
2430
+ '𝐒' => 'S',
2431
+ '𝐓' => 'T',
2432
+ '𝐔' => 'U',
2433
+ '𝐕' => 'V',
2434
+ '𝐖' => 'W',
2435
+ '𝐗' => 'X',
2436
+ '𝐘' => 'Y',
2437
+ '𝐙' => 'Z',
2438
+ '𝐚' => 'a',
2439
+ '𝐛' => 'b',
2440
+ '𝐜' => 'c',
2441
+ '𝐝' => 'd',
2442
+ '𝐞' => 'e',
2443
+ '𝐟' => 'f',
2444
+ '𝐠' => 'g',
2445
+ '𝐡' => 'h',
2446
+ '𝐢' => 'i',
2447
+ '𝐣' => 'j',
2448
+ '𝐤' => 'k',
2449
+ '𝐥' => 'l',
2450
+ '𝐦' => 'm',
2451
+ '𝐧' => 'n',
2452
+ '𝐨' => 'o',
2453
+ '𝐩' => 'p',
2454
+ '𝐪' => 'q',
2455
+ '𝐫' => 'r',
2456
+ '𝐬' => 's',
2457
+ '𝐭' => 't',
2458
+ '𝐮' => 'u',
2459
+ '𝐯' => 'v',
2460
+ '𝐰' => 'w',
2461
+ '𝐱' => 'x',
2462
+ '𝐲' => 'y',
2463
+ '𝐳' => 'z',
2464
+ '𝐴' => 'A',
2465
+ '𝐵' => 'B',
2466
+ '𝐶' => 'C',
2467
+ '𝐷' => 'D',
2468
+ '𝐸' => 'E',
2469
+ '𝐹' => 'F',
2470
+ '𝐺' => 'G',
2471
+ '𝐻' => 'H',
2472
+ '𝐼' => 'I',
2473
+ '𝐽' => 'J',
2474
+ '𝐾' => 'K',
2475
+ '𝐿' => 'L',
2476
+ '𝑀' => 'M',
2477
+ '𝑁' => 'N',
2478
+ '𝑂' => 'O',
2479
+ '𝑃' => 'P',
2480
+ '𝑄' => 'Q',
2481
+ '𝑅' => 'R',
2482
+ '𝑆' => 'S',
2483
+ '𝑇' => 'T',
2484
+ '𝑈' => 'U',
2485
+ '𝑉' => 'V',
2486
+ '𝑊' => 'W',
2487
+ '𝑋' => 'X',
2488
+ '𝑌' => 'Y',
2489
+ '𝑍' => 'Z',
2490
+ '𝑎' => 'a',
2491
+ '𝑏' => 'b',
2492
+ '𝑐' => 'c',
2493
+ '𝑑' => 'd',
2494
+ '𝑒' => 'e',
2495
+ '𝑓' => 'f',
2496
+ '𝑔' => 'g',
2497
+ '𝑖' => 'i',
2498
+ '𝑗' => 'j',
2499
+ '𝑘' => 'k',
2500
+ '𝑙' => 'l',
2501
+ '𝑚' => 'm',
2502
+ '𝑛' => 'n',
2503
+ '𝑜' => 'o',
2504
+ '𝑝' => 'p',
2505
+ '𝑞' => 'q',
2506
+ '𝑟' => 'r',
2507
+ '𝑠' => 's',
2508
+ '𝑡' => 't',
2509
+ '𝑢' => 'u',
2510
+ '𝑣' => 'v',
2511
+ '𝑤' => 'w',
2512
+ '𝑥' => 'x',
2513
+ '𝑦' => 'y',
2514
+ '𝑧' => 'z',
2515
+ '𝑨' => 'A',
2516
+ '𝑩' => 'B',
2517
+ '𝑪' => 'C',
2518
+ '𝑫' => 'D',
2519
+ '𝑬' => 'E',
2520
+ '𝑭' => 'F',
2521
+ '𝑮' => 'G',
2522
+ '𝑯' => 'H',
2523
+ '𝑰' => 'I',
2524
+ '𝑱' => 'J',
2525
+ '𝑲' => 'K',
2526
+ '𝑳' => 'L',
2527
+ '𝑴' => 'M',
2528
+ '𝑵' => 'N',
2529
+ '𝑶' => 'O',
2530
+ '𝑷' => 'P',
2531
+ '𝑸' => 'Q',
2532
+ '𝑹' => 'R',
2533
+ '𝑺' => 'S',
2534
+ '𝑻' => 'T',
2535
+ '𝑼' => 'U',
2536
+ '𝑽' => 'V',
2537
+ '𝑾' => 'W',
2538
+ '𝑿' => 'X',
2539
+ '𝒀' => 'Y',
2540
+ '𝒁' => 'Z',
2541
+ '𝒂' => 'a',
2542
+ '𝒃' => 'b',
2543
+ '𝒄' => 'c',
2544
+ '𝒅' => 'd',
2545
+ '𝒆' => 'e',
2546
+ '𝒇' => 'f',
2547
+ '𝒈' => 'g',
2548
+ '𝒉' => 'h',
2549
+ '𝒊' => 'i',
2550
+ '𝒋' => 'j',
2551
+ '𝒌' => 'k',
2552
+ '𝒍' => 'l',
2553
+ '𝒎' => 'm',
2554
+ '𝒏' => 'n',
2555
+ '𝒐' => 'o',
2556
+ '𝒑' => 'p',
2557
+ '𝒒' => 'q',
2558
+ '𝒓' => 'r',
2559
+ '𝒔' => 's',
2560
+ '𝒕' => 't',
2561
+ '𝒖' => 'u',
2562
+ '𝒗' => 'v',
2563
+ '𝒘' => 'w',
2564
+ '𝒙' => 'x',
2565
+ '𝒚' => 'y',
2566
+ '𝒛' => 'z',
2567
+ '𝒜' => 'A',
2568
+ '𝒞' => 'C',
2569
+ '𝒟' => 'D',
2570
+ '𝒢' => 'G',
2571
+ '𝒥' => 'J',
2572
+ '𝒦' => 'K',
2573
+ '𝒩' => 'N',
2574
+ '𝒪' => 'O',
2575
+ '𝒫' => 'P',
2576
+ '𝒬' => 'Q',
2577
+ '𝒮' => 'S',
2578
+ '𝒯' => 'T',
2579
+ '𝒰' => 'U',
2580
+ '𝒱' => 'V',
2581
+ '𝒲' => 'W',
2582
+ '𝒳' => 'X',
2583
+ '𝒴' => 'Y',
2584
+ '𝒵' => 'Z',
2585
+ '𝒶' => 'a',
2586
+ '𝒷' => 'b',
2587
+ '𝒸' => 'c',
2588
+ '𝒹' => 'd',
2589
+ '𝒻' => 'f',
2590
+ '𝒽' => 'h',
2591
+ '𝒾' => 'i',
2592
+ '𝒿' => 'j',
2593
+ '𝓀' => 'k',
2594
+ '𝓁' => 'l',
2595
+ '𝓂' => 'm',
2596
+ '𝓃' => 'n',
2597
+ '𝓅' => 'p',
2598
+ '𝓆' => 'q',
2599
+ '𝓇' => 'r',
2600
+ '𝓈' => 's',
2601
+ '𝓉' => 't',
2602
+ '𝓊' => 'u',
2603
+ '𝓋' => 'v',
2604
+ '𝓌' => 'w',
2605
+ '𝓍' => 'x',
2606
+ '𝓎' => 'y',
2607
+ '𝓏' => 'z',
2608
+ '𝓐' => 'A',
2609
+ '𝓑' => 'B',
2610
+ '𝓒' => 'C',
2611
+ '𝓓' => 'D',
2612
+ '𝓔' => 'E',
2613
+ '𝓕' => 'F',
2614
+ '𝓖' => 'G',
2615
+ '𝓗' => 'H',
2616
+ '𝓘' => 'I',
2617
+ '𝓙' => 'J',
2618
+ '𝓚' => 'K',
2619
+ '𝓛' => 'L',
2620
+ '𝓜' => 'M',
2621
+ '𝓝' => 'N',
2622
+ '𝓞' => 'O',
2623
+ '𝓟' => 'P',
2624
+ '𝓠' => 'Q',
2625
+ '𝓡' => 'R',
2626
+ '𝓢' => 'S',
2627
+ '𝓣' => 'T',
2628
+ '𝓤' => 'U',
2629
+ '𝓥' => 'V',
2630
+ '𝓦' => 'W',
2631
+ '𝓧' => 'X',
2632
+ '𝓨' => 'Y',
2633
+ '𝓩' => 'Z',
2634
+ '𝓪' => 'a',
2635
+ '𝓫' => 'b',
2636
+ '𝓬' => 'c',
2637
+ '𝓭' => 'd',
2638
+ '𝓮' => 'e',
2639
+ '𝓯' => 'f',
2640
+ '𝓰' => 'g',
2641
+ '𝓱' => 'h',
2642
+ '𝓲' => 'i',
2643
+ '𝓳' => 'j',
2644
+ '𝓴' => 'k',
2645
+ '𝓵' => 'l',
2646
+ '𝓶' => 'm',
2647
+ '𝓷' => 'n',
2648
+ '𝓸' => 'o',
2649
+ '𝓹' => 'p',
2650
+ '𝓺' => 'q',
2651
+ '𝓻' => 'r',
2652
+ '𝓼' => 's',
2653
+ '𝓽' => 't',
2654
+ '𝓾' => 'u',
2655
+ '𝓿' => 'v',
2656
+ '𝔀' => 'w',
2657
+ '𝔁' => 'x',
2658
+ '𝔂' => 'y',
2659
+ '𝔃' => 'z',
2660
+ '𝔄' => 'A',
2661
+ '𝔅' => 'B',
2662
+ '𝔇' => 'D',
2663
+ '𝔈' => 'E',
2664
+ '𝔉' => 'F',
2665
+ '𝔊' => 'G',
2666
+ '𝔍' => 'J',
2667
+ '𝔎' => 'K',
2668
+ '𝔏' => 'L',
2669
+ '𝔐' => 'M',
2670
+ '𝔑' => 'N',
2671
+ '𝔒' => 'O',
2672
+ '𝔓' => 'P',
2673
+ '𝔔' => 'Q',
2674
+ '𝔖' => 'S',
2675
+ '𝔗' => 'T',
2676
+ '𝔘' => 'U',
2677
+ '𝔙' => 'V',
2678
+ '𝔚' => 'W',
2679
+ '𝔛' => 'X',
2680
+ '𝔜' => 'Y',
2681
+ '𝔞' => 'a',
2682
+ '𝔟' => 'b',
2683
+ '𝔠' => 'c',
2684
+ '𝔡' => 'd',
2685
+ '𝔢' => 'e',
2686
+ '𝔣' => 'f',
2687
+ '𝔤' => 'g',
2688
+ '𝔥' => 'h',
2689
+ '𝔦' => 'i',
2690
+ '𝔧' => 'j',
2691
+ '𝔨' => 'k',
2692
+ '𝔩' => 'l',
2693
+ '𝔪' => 'm',
2694
+ '𝔫' => 'n',
2695
+ '𝔬' => 'o',
2696
+ '𝔭' => 'p',
2697
+ '𝔮' => 'q',
2698
+ '𝔯' => 'r',
2699
+ '𝔰' => 's',
2700
+ '𝔱' => 't',
2701
+ '𝔲' => 'u',
2702
+ '𝔳' => 'v',
2703
+ '𝔴' => 'w',
2704
+ '𝔵' => 'x',
2705
+ '𝔶' => 'y',
2706
+ '𝔷' => 'z',
2707
+ '𝔸' => 'A',
2708
+ '𝔹' => 'B',
2709
+ '𝔻' => 'D',
2710
+ '𝔼' => 'E',
2711
+ '𝔽' => 'F',
2712
+ '𝔾' => 'G',
2713
+ '𝕀' => 'I',
2714
+ '𝕁' => 'J',
2715
+ '𝕂' => 'K',
2716
+ '𝕃' => 'L',
2717
+ '𝕄' => 'M',
2718
+ '𝕆' => 'O',
2719
+ '𝕊' => 'S',
2720
+ '𝕋' => 'T',
2721
+ '𝕌' => 'U',
2722
+ '𝕍' => 'V',
2723
+ '𝕎' => 'W',
2724
+ '𝕏' => 'X',
2725
+ '𝕐' => 'Y',
2726
+ '𝕒' => 'a',
2727
+ '𝕓' => 'b',
2728
+ '𝕔' => 'c',
2729
+ '𝕕' => 'd',
2730
+ '𝕖' => 'e',
2731
+ '𝕗' => 'f',
2732
+ '𝕘' => 'g',
2733
+ '𝕙' => 'h',
2734
+ '𝕚' => 'i',
2735
+ '𝕛' => 'j',
2736
+ '𝕜' => 'k',
2737
+ '𝕝' => 'l',
2738
+ '𝕞' => 'm',
2739
+ '𝕟' => 'n',
2740
+ '𝕠' => 'o',
2741
+ '𝕡' => 'p',
2742
+ '𝕢' => 'q',
2743
+ '𝕣' => 'r',
2744
+ '𝕤' => 's',
2745
+ '𝕥' => 't',
2746
+ '𝕦' => 'u',
2747
+ '𝕧' => 'v',
2748
+ '𝕨' => 'w',
2749
+ '𝕩' => 'x',
2750
+ '𝕪' => 'y',
2751
+ '𝕫' => 'z',
2752
+ '𝕬' => 'A',
2753
+ '𝕭' => 'B',
2754
+ '𝕮' => 'C',
2755
+ '𝕯' => 'D',
2756
+ '𝕰' => 'E',
2757
+ '𝕱' => 'F',
2758
+ '𝕲' => 'G',
2759
+ '𝕳' => 'H',
2760
+ '𝕴' => 'I',
2761
+ '𝕵' => 'J',
2762
+ '𝕶' => 'K',
2763
+ '𝕷' => 'L',
2764
+ '𝕸' => 'M',
2765
+ '𝕹' => 'N',
2766
+ '𝕺' => 'O',
2767
+ '𝕻' => 'P',
2768
+ '𝕼' => 'Q',
2769
+ '𝕽' => 'R',
2770
+ '𝕾' => 'S',
2771
+ '𝕿' => 'T',
2772
+ '𝖀' => 'U',
2773
+ '𝖁' => 'V',
2774
+ '𝖂' => 'W',
2775
+ '𝖃' => 'X',
2776
+ '𝖄' => 'Y',
2777
+ '𝖅' => 'Z',
2778
+ '𝖆' => 'a',
2779
+ '𝖇' => 'b',
2780
+ '𝖈' => 'c',
2781
+ '𝖉' => 'd',
2782
+ '𝖊' => 'e',
2783
+ '𝖋' => 'f',
2784
+ '𝖌' => 'g',
2785
+ '𝖍' => 'h',
2786
+ '𝖎' => 'i',
2787
+ '𝖏' => 'j',
2788
+ '𝖐' => 'k',
2789
+ '𝖑' => 'l',
2790
+ '𝖒' => 'm',
2791
+ '𝖓' => 'n',
2792
+ '𝖔' => 'o',
2793
+ '𝖕' => 'p',
2794
+ '𝖖' => 'q',
2795
+ '𝖗' => 'r',
2796
+ '𝖘' => 's',
2797
+ '𝖙' => 't',
2798
+ '𝖚' => 'u',
2799
+ '𝖛' => 'v',
2800
+ '𝖜' => 'w',
2801
+ '𝖝' => 'x',
2802
+ '𝖞' => 'y',
2803
+ '𝖟' => 'z',
2804
+ '𝖠' => 'A',
2805
+ '𝖡' => 'B',
2806
+ '𝖢' => 'C',
2807
+ '𝖣' => 'D',
2808
+ '𝖤' => 'E',
2809
+ '𝖥' => 'F',
2810
+ '𝖦' => 'G',
2811
+ '𝖧' => 'H',
2812
+ '𝖨' => 'I',
2813
+ '𝖩' => 'J',
2814
+ '𝖪' => 'K',
2815
+ '𝖫' => 'L',
2816
+ '𝖬' => 'M',
2817
+ '𝖭' => 'N',
2818
+ '𝖮' => 'O',
2819
+ '𝖯' => 'P',
2820
+ '𝖰' => 'Q',
2821
+ '𝖱' => 'R',
2822
+ '𝖲' => 'S',
2823
+ '𝖳' => 'T',
2824
+ '𝖴' => 'U',
2825
+ '𝖵' => 'V',
2826
+ '𝖶' => 'W',
2827
+ '𝖷' => 'X',
2828
+ '𝖸' => 'Y',
2829
+ '𝖹' => 'Z',
2830
+ '𝖺' => 'a',
2831
+ '𝖻' => 'b',
2832
+ '𝖼' => 'c',
2833
+ '𝖽' => 'd',
2834
+ '𝖾' => 'e',
2835
+ '𝖿' => 'f',
2836
+ '𝗀' => 'g',
2837
+ '𝗁' => 'h',
2838
+ '𝗂' => 'i',
2839
+ '𝗃' => 'j',
2840
+ '𝗄' => 'k',
2841
+ '𝗅' => 'l',
2842
+ '𝗆' => 'm',
2843
+ '𝗇' => 'n',
2844
+ '𝗈' => 'o',
2845
+ '𝗉' => 'p',
2846
+ '𝗊' => 'q',
2847
+ '𝗋' => 'r',
2848
+ '𝗌' => 's',
2849
+ '𝗍' => 't',
2850
+ '𝗎' => 'u',
2851
+ '𝗏' => 'v',
2852
+ '𝗐' => 'w',
2853
+ '𝗑' => 'x',
2854
+ '𝗒' => 'y',
2855
+ '𝗓' => 'z',
2856
+ '𝗔' => 'A',
2857
+ '𝗕' => 'B',
2858
+ '𝗖' => 'C',
2859
+ '𝗗' => 'D',
2860
+ '𝗘' => 'E',
2861
+ '𝗙' => 'F',
2862
+ '𝗚' => 'G',
2863
+ '𝗛' => 'H',
2864
+ '𝗜' => 'I',
2865
+ '𝗝' => 'J',
2866
+ '𝗞' => 'K',
2867
+ '𝗟' => 'L',
2868
+ '𝗠' => 'M',
2869
+ '𝗡' => 'N',
2870
+ '𝗢' => 'O',
2871
+ '𝗣' => 'P',
2872
+ '𝗤' => 'Q',
2873
+ '𝗥' => 'R',
2874
+ '𝗦' => 'S',
2875
+ '𝗧' => 'T',
2876
+ '𝗨' => 'U',
2877
+ '𝗩' => 'V',
2878
+ '𝗪' => 'W',
2879
+ '𝗫' => 'X',
2880
+ '𝗬' => 'Y',
2881
+ '𝗭' => 'Z',
2882
+ '𝗮' => 'a',
2883
+ '𝗯' => 'b',
2884
+ '𝗰' => 'c',
2885
+ '𝗱' => 'd',
2886
+ '𝗲' => 'e',
2887
+ '𝗳' => 'f',
2888
+ '𝗴' => 'g',
2889
+ '𝗵' => 'h',
2890
+ '𝗶' => 'i',
2891
+ '𝗷' => 'j',
2892
+ '𝗸' => 'k',
2893
+ '𝗹' => 'l',
2894
+ '𝗺' => 'm',
2895
+ '𝗻' => 'n',
2896
+ '𝗼' => 'o',
2897
+ '𝗽' => 'p',
2898
+ '𝗾' => 'q',
2899
+ '𝗿' => 'r',
2900
+ '𝘀' => 's',
2901
+ '𝘁' => 't',
2902
+ '𝘂' => 'u',
2903
+ '𝘃' => 'v',
2904
+ '𝘄' => 'w',
2905
+ '𝘅' => 'x',
2906
+ '𝘆' => 'y',
2907
+ '𝘇' => 'z',
2908
+ '𝘈' => 'A',
2909
+ '𝘉' => 'B',
2910
+ '𝘊' => 'C',
2911
+ '𝘋' => 'D',
2912
+ '𝘌' => 'E',
2913
+ '𝘍' => 'F',
2914
+ '𝘎' => 'G',
2915
+ '𝘏' => 'H',
2916
+ '𝘐' => 'I',
2917
+ '𝘑' => 'J',
2918
+ '𝘒' => 'K',
2919
+ '𝘓' => 'L',
2920
+ '𝘔' => 'M',
2921
+ '𝘕' => 'N',
2922
+ '𝘖' => 'O',
2923
+ '𝘗' => 'P',
2924
+ '𝘘' => 'Q',
2925
+ '𝘙' => 'R',
2926
+ '𝘚' => 'S',
2927
+ '𝘛' => 'T',
2928
+ '𝘜' => 'U',
2929
+ '𝘝' => 'V',
2930
+ '𝘞' => 'W',
2931
+ '𝘟' => 'X',
2932
+ '𝘠' => 'Y',
2933
+ '𝘡' => 'Z',
2934
+ '𝘢' => 'a',
2935
+ '𝘣' => 'b',
2936
+ '𝘤' => 'c',
2937
+ '𝘥' => 'd',
2938
+ '𝘦' => 'e',
2939
+ '𝘧' => 'f',
2940
+ '𝘨' => 'g',
2941
+ '𝘩' => 'h',
2942
+ '𝘪' => 'i',
2943
+ '𝘫' => 'j',
2944
+ '𝘬' => 'k',
2945
+ '𝘭' => 'l',
2946
+ '𝘮' => 'm',
2947
+ '𝘯' => 'n',
2948
+ '𝘰' => 'o',
2949
+ '𝘱' => 'p',
2950
+ '𝘲' => 'q',
2951
+ '𝘳' => 'r',
2952
+ '𝘴' => 's',
2953
+ '𝘵' => 't',
2954
+ '𝘶' => 'u',
2955
+ '𝘷' => 'v',
2956
+ '𝘸' => 'w',
2957
+ '𝘹' => 'x',
2958
+ '𝘺' => 'y',
2959
+ '𝘻' => 'z',
2960
+ '𝘼' => 'A',
2961
+ '𝘽' => 'B',
2962
+ '𝘾' => 'C',
2963
+ '𝘿' => 'D',
2964
+ '𝙀' => 'E',
2965
+ '𝙁' => 'F',
2966
+ '𝙂' => 'G',
2967
+ '𝙃' => 'H',
2968
+ '𝙄' => 'I',
2969
+ '𝙅' => 'J',
2970
+ '𝙆' => 'K',
2971
+ '𝙇' => 'L',
2972
+ '𝙈' => 'M',
2973
+ '𝙉' => 'N',
2974
+ '𝙊' => 'O',
2975
+ '𝙋' => 'P',
2976
+ '𝙌' => 'Q',
2977
+ '𝙍' => 'R',
2978
+ '𝙎' => 'S',
2979
+ '𝙏' => 'T',
2980
+ '𝙐' => 'U',
2981
+ '𝙑' => 'V',
2982
+ '𝙒' => 'W',
2983
+ '𝙓' => 'X',
2984
+ '𝙔' => 'Y',
2985
+ '𝙕' => 'Z',
2986
+ '𝙖' => 'a',
2987
+ '𝙗' => 'b',
2988
+ '𝙘' => 'c',
2989
+ '𝙙' => 'd',
2990
+ '𝙚' => 'e',
2991
+ '𝙛' => 'f',
2992
+ '𝙜' => 'g',
2993
+ '𝙝' => 'h',
2994
+ '𝙞' => 'i',
2995
+ '𝙟' => 'j',
2996
+ '𝙠' => 'k',
2997
+ '𝙡' => 'l',
2998
+ '𝙢' => 'm',
2999
+ '𝙣' => 'n',
3000
+ '𝙤' => 'o',
3001
+ '𝙥' => 'p',
3002
+ '𝙦' => 'q',
3003
+ '𝙧' => 'r',
3004
+ '𝙨' => 's',
3005
+ '𝙩' => 't',
3006
+ '𝙪' => 'u',
3007
+ '𝙫' => 'v',
3008
+ '𝙬' => 'w',
3009
+ '𝙭' => 'x',
3010
+ '𝙮' => 'y',
3011
+ '𝙯' => 'z',
3012
+ '𝙰' => 'A',
3013
+ '𝙱' => 'B',
3014
+ '𝙲' => 'C',
3015
+ '𝙳' => 'D',
3016
+ '𝙴' => 'E',
3017
+ '𝙵' => 'F',
3018
+ '𝙶' => 'G',
3019
+ '𝙷' => 'H',
3020
+ '𝙸' => 'I',
3021
+ '𝙹' => 'J',
3022
+ '𝙺' => 'K',
3023
+ '𝙻' => 'L',
3024
+ '𝙼' => 'M',
3025
+ '𝙽' => 'N',
3026
+ '𝙾' => 'O',
3027
+ '𝙿' => 'P',
3028
+ '𝚀' => 'Q',
3029
+ '𝚁' => 'R',
3030
+ '𝚂' => 'S',
3031
+ '𝚃' => 'T',
3032
+ '𝚄' => 'U',
3033
+ '𝚅' => 'V',
3034
+ '𝚆' => 'W',
3035
+ '𝚇' => 'X',
3036
+ '𝚈' => 'Y',
3037
+ '𝚉' => 'Z',
3038
+ '𝚊' => 'a',
3039
+ '𝚋' => 'b',
3040
+ '𝚌' => 'c',
3041
+ '𝚍' => 'd',
3042
+ '𝚎' => 'e',
3043
+ '𝚏' => 'f',
3044
+ '𝚐' => 'g',
3045
+ '𝚑' => 'h',
3046
+ '𝚒' => 'i',
3047
+ '𝚓' => 'j',
3048
+ '𝚔' => 'k',
3049
+ '𝚕' => 'l',
3050
+ '𝚖' => 'm',
3051
+ '𝚗' => 'n',
3052
+ '𝚘' => 'o',
3053
+ '𝚙' => 'p',
3054
+ '𝚚' => 'q',
3055
+ '𝚛' => 'r',
3056
+ '𝚜' => 's',
3057
+ '𝚝' => 't',
3058
+ '𝚞' => 'u',
3059
+ '𝚟' => 'v',
3060
+ '𝚠' => 'w',
3061
+ '𝚡' => 'x',
3062
+ '𝚢' => 'y',
3063
+ '𝚣' => 'z',
3064
+ '𝚤' => 'ı',
3065
+ '𝚥' => 'ȷ',
3066
+ '𝚨' => 'Α',
3067
+ '𝚩' => 'Β',
3068
+ '𝚪' => 'Γ',
3069
+ '𝚫' => 'Δ',
3070
+ '𝚬' => 'Ε',
3071
+ '𝚭' => 'Ζ',
3072
+ '𝚮' => 'Η',
3073
+ '𝚯' => 'Θ',
3074
+ '𝚰' => 'Ι',
3075
+ '𝚱' => 'Κ',
3076
+ '𝚲' => 'Λ',
3077
+ '𝚳' => 'Μ',
3078
+ '𝚴' => 'Ν',
3079
+ '𝚵' => 'Ξ',
3080
+ '𝚶' => 'Ο',
3081
+ '𝚷' => 'Π',
3082
+ '𝚸' => 'Ρ',
3083
+ '𝚹' => 'Θ',
3084
+ '𝚺' => 'Σ',
3085
+ '𝚻' => 'Τ',
3086
+ '𝚼' => 'Υ',
3087
+ '𝚽' => 'Φ',
3088
+ '𝚾' => 'Χ',
3089
+ '𝚿' => 'Ψ',
3090
+ '𝛀' => 'Ω',
3091
+ '𝛁' => '∇',
3092
+ '𝛂' => 'α',
3093
+ '𝛃' => 'β',
3094
+ '𝛄' => 'γ',
3095
+ '𝛅' => 'δ',
3096
+ '𝛆' => 'ε',
3097
+ '𝛇' => 'ζ',
3098
+ '𝛈' => 'η',
3099
+ '𝛉' => 'θ',
3100
+ '𝛊' => 'ι',
3101
+ '𝛋' => 'κ',
3102
+ '𝛌' => 'λ',
3103
+ '𝛍' => 'μ',
3104
+ '𝛎' => 'ν',
3105
+ '𝛏' => 'ξ',
3106
+ '𝛐' => 'ο',
3107
+ '𝛑' => 'π',
3108
+ '𝛒' => 'ρ',
3109
+ '𝛓' => 'ς',
3110
+ '𝛔' => 'σ',
3111
+ '𝛕' => 'τ',
3112
+ '𝛖' => 'υ',
3113
+ '𝛗' => 'φ',
3114
+ '𝛘' => 'χ',
3115
+ '𝛙' => 'ψ',
3116
+ '𝛚' => 'ω',
3117
+ '𝛛' => '∂',
3118
+ '𝛜' => 'ε',
3119
+ '𝛝' => 'θ',
3120
+ '𝛞' => 'κ',
3121
+ '𝛟' => 'φ',
3122
+ '𝛠' => 'ρ',
3123
+ '𝛡' => 'π',
3124
+ '𝛢' => 'Α',
3125
+ '𝛣' => 'Β',
3126
+ '𝛤' => 'Γ',
3127
+ '𝛥' => 'Δ',
3128
+ '𝛦' => 'Ε',
3129
+ '𝛧' => 'Ζ',
3130
+ '𝛨' => 'Η',
3131
+ '𝛩' => 'Θ',
3132
+ '𝛪' => 'Ι',
3133
+ '𝛫' => 'Κ',
3134
+ '𝛬' => 'Λ',
3135
+ '𝛭' => 'Μ',
3136
+ '𝛮' => 'Ν',
3137
+ '𝛯' => 'Ξ',
3138
+ '𝛰' => 'Ο',
3139
+ '𝛱' => 'Π',
3140
+ '𝛲' => 'Ρ',
3141
+ '𝛳' => 'Θ',
3142
+ '𝛴' => 'Σ',
3143
+ '𝛵' => 'Τ',
3144
+ '𝛶' => 'Υ',
3145
+ '𝛷' => 'Φ',
3146
+ '𝛸' => 'Χ',
3147
+ '𝛹' => 'Ψ',
3148
+ '𝛺' => 'Ω',
3149
+ '𝛻' => '∇',
3150
+ '𝛼' => 'α',
3151
+ '𝛽' => 'β',
3152
+ '𝛾' => 'γ',
3153
+ '𝛿' => 'δ',
3154
+ '𝜀' => 'ε',
3155
+ '𝜁' => 'ζ',
3156
+ '𝜂' => 'η',
3157
+ '𝜃' => 'θ',
3158
+ '𝜄' => 'ι',
3159
+ '𝜅' => 'κ',
3160
+ '𝜆' => 'λ',
3161
+ '𝜇' => 'μ',
3162
+ '𝜈' => 'ν',
3163
+ '𝜉' => 'ξ',
3164
+ '𝜊' => 'ο',
3165
+ '𝜋' => 'π',
3166
+ '𝜌' => 'ρ',
3167
+ '𝜍' => 'ς',
3168
+ '𝜎' => 'σ',
3169
+ '𝜏' => 'τ',
3170
+ '𝜐' => 'υ',
3171
+ '𝜑' => 'φ',
3172
+ '𝜒' => 'χ',
3173
+ '𝜓' => 'ψ',
3174
+ '𝜔' => 'ω',
3175
+ '𝜕' => '∂',
3176
+ '𝜖' => 'ε',
3177
+ '𝜗' => 'θ',
3178
+ '𝜘' => 'κ',
3179
+ '𝜙' => 'φ',
3180
+ '𝜚' => 'ρ',
3181
+ '𝜛' => 'π',
3182
+ '𝜜' => 'Α',
3183
+ '𝜝' => 'Β',
3184
+ '𝜞' => 'Γ',
3185
+ '𝜟' => 'Δ',
3186
+ '𝜠' => 'Ε',
3187
+ '𝜡' => 'Ζ',
3188
+ '𝜢' => 'Η',
3189
+ '𝜣' => 'Θ',
3190
+ '𝜤' => 'Ι',
3191
+ '𝜥' => 'Κ',
3192
+ '𝜦' => 'Λ',
3193
+ '𝜧' => 'Μ',
3194
+ '𝜨' => 'Ν',
3195
+ '𝜩' => 'Ξ',
3196
+ '𝜪' => 'Ο',
3197
+ '𝜫' => 'Π',
3198
+ '𝜬' => 'Ρ',
3199
+ '𝜭' => 'Θ',
3200
+ '𝜮' => 'Σ',
3201
+ '𝜯' => 'Τ',
3202
+ '𝜰' => 'Υ',
3203
+ '𝜱' => 'Φ',
3204
+ '𝜲' => 'Χ',
3205
+ '𝜳' => 'Ψ',
3206
+ '𝜴' => 'Ω',
3207
+ '𝜵' => '∇',
3208
+ '𝜶' => 'α',
3209
+ '𝜷' => 'β',
3210
+ '𝜸' => 'γ',
3211
+ '𝜹' => 'δ',
3212
+ '𝜺' => 'ε',
3213
+ '𝜻' => 'ζ',
3214
+ '𝜼' => 'η',
3215
+ '𝜽' => 'θ',
3216
+ '𝜾' => 'ι',
3217
+ '𝜿' => 'κ',
3218
+ '𝝀' => 'λ',
3219
+ '𝝁' => 'μ',
3220
+ '𝝂' => 'ν',
3221
+ '𝝃' => 'ξ',
3222
+ '𝝄' => 'ο',
3223
+ '𝝅' => 'π',
3224
+ '𝝆' => 'ρ',
3225
+ '𝝇' => 'ς',
3226
+ '𝝈' => 'σ',
3227
+ '𝝉' => 'τ',
3228
+ '𝝊' => 'υ',
3229
+ '𝝋' => 'φ',
3230
+ '𝝌' => 'χ',
3231
+ '𝝍' => 'ψ',
3232
+ '𝝎' => 'ω',
3233
+ '𝝏' => '∂',
3234
+ '𝝐' => 'ε',
3235
+ '𝝑' => 'θ',
3236
+ '𝝒' => 'κ',
3237
+ '𝝓' => 'φ',
3238
+ '𝝔' => 'ρ',
3239
+ '𝝕' => 'π',
3240
+ '𝝖' => 'Α',
3241
+ '𝝗' => 'Β',
3242
+ '𝝘' => 'Γ',
3243
+ '𝝙' => 'Δ',
3244
+ '𝝚' => 'Ε',
3245
+ '𝝛' => 'Ζ',
3246
+ '𝝜' => 'Η',
3247
+ '𝝝' => 'Θ',
3248
+ '𝝞' => 'Ι',
3249
+ '𝝟' => 'Κ',
3250
+ '𝝠' => 'Λ',
3251
+ '𝝡' => 'Μ',
3252
+ '𝝢' => 'Ν',
3253
+ '𝝣' => 'Ξ',
3254
+ '𝝤' => 'Ο',
3255
+ '𝝥' => 'Π',
3256
+ '𝝦' => 'Ρ',
3257
+ '𝝧' => 'Θ',
3258
+ '𝝨' => 'Σ',
3259
+ '𝝩' => 'Τ',
3260
+ '𝝪' => 'Υ',
3261
+ '𝝫' => 'Φ',
3262
+ '𝝬' => 'Χ',
3263
+ '𝝭' => 'Ψ',
3264
+ '𝝮' => 'Ω',
3265
+ '𝝯' => '∇',
3266
+ '𝝰' => 'α',
3267
+ '𝝱' => 'β',
3268
+ '𝝲' => 'γ',
3269
+ '𝝳' => 'δ',
3270
+ '𝝴' => 'ε',
3271
+ '𝝵' => 'ζ',
3272
+ '𝝶' => 'η',
3273
+ '𝝷' => 'θ',
3274
+ '𝝸' => 'ι',
3275
+ '𝝹' => 'κ',
3276
+ '𝝺' => 'λ',
3277
+ '𝝻' => 'μ',
3278
+ '𝝼' => 'ν',
3279
+ '𝝽' => 'ξ',
3280
+ '𝝾' => 'ο',
3281
+ '𝝿' => 'π',
3282
+ '𝞀' => 'ρ',
3283
+ '𝞁' => 'ς',
3284
+ '𝞂' => 'σ',
3285
+ '𝞃' => 'τ',
3286
+ '𝞄' => 'υ',
3287
+ '𝞅' => 'φ',
3288
+ '𝞆' => 'χ',
3289
+ '𝞇' => 'ψ',
3290
+ '𝞈' => 'ω',
3291
+ '𝞉' => '∂',
3292
+ '𝞊' => 'ε',
3293
+ '𝞋' => 'θ',
3294
+ '𝞌' => 'κ',
3295
+ '𝞍' => 'φ',
3296
+ '𝞎' => 'ρ',
3297
+ '𝞏' => 'π',
3298
+ '𝞐' => 'Α',
3299
+ '𝞑' => 'Β',
3300
+ '𝞒' => 'Γ',
3301
+ '𝞓' => 'Δ',
3302
+ '𝞔' => 'Ε',
3303
+ '𝞕' => 'Ζ',
3304
+ '𝞖' => 'Η',
3305
+ '𝞗' => 'Θ',
3306
+ '𝞘' => 'Ι',
3307
+ '𝞙' => 'Κ',
3308
+ '𝞚' => 'Λ',
3309
+ '𝞛' => 'Μ',
3310
+ '𝞜' => 'Ν',
3311
+ '𝞝' => 'Ξ',
3312
+ '𝞞' => 'Ο',
3313
+ '𝞟' => 'Π',
3314
+ '𝞠' => 'Ρ',
3315
+ '𝞡' => 'Θ',
3316
+ '𝞢' => 'Σ',
3317
+ '𝞣' => 'Τ',
3318
+ '𝞤' => 'Υ',
3319
+ '𝞥' => 'Φ',
3320
+ '𝞦' => 'Χ',
3321
+ '𝞧' => 'Ψ',
3322
+ '𝞨' => 'Ω',
3323
+ '𝞩' => '∇',
3324
+ '𝞪' => 'α',
3325
+ '𝞫' => 'β',
3326
+ '𝞬' => 'γ',
3327
+ '𝞭' => 'δ',
3328
+ '𝞮' => 'ε',
3329
+ '𝞯' => 'ζ',
3330
+ '𝞰' => 'η',
3331
+ '𝞱' => 'θ',
3332
+ '𝞲' => 'ι',
3333
+ '𝞳' => 'κ',
3334
+ '𝞴' => 'λ',
3335
+ '𝞵' => 'μ',
3336
+ '𝞶' => 'ν',
3337
+ '𝞷' => 'ξ',
3338
+ '𝞸' => 'ο',
3339
+ '𝞹' => 'π',
3340
+ '𝞺' => 'ρ',
3341
+ '𝞻' => 'ς',
3342
+ '𝞼' => 'σ',
3343
+ '𝞽' => 'τ',
3344
+ '𝞾' => 'υ',
3345
+ '𝞿' => 'φ',
3346
+ '𝟀' => 'χ',
3347
+ '𝟁' => 'ψ',
3348
+ '𝟂' => 'ω',
3349
+ '𝟃' => '∂',
3350
+ '𝟄' => 'ε',
3351
+ '𝟅' => 'θ',
3352
+ '𝟆' => 'κ',
3353
+ '𝟇' => 'φ',
3354
+ '𝟈' => 'ρ',
3355
+ '𝟉' => 'π',
3356
+ '𝟊' => 'Ϝ',
3357
+ '𝟋' => 'ϝ',
3358
+ '𝟎' => '0',
3359
+ '𝟏' => '1',
3360
+ '𝟐' => '2',
3361
+ '𝟑' => '3',
3362
+ '𝟒' => '4',
3363
+ '𝟓' => '5',
3364
+ '𝟔' => '6',
3365
+ '𝟕' => '7',
3366
+ '𝟖' => '8',
3367
+ '𝟗' => '9',
3368
+ '𝟘' => '0',
3369
+ '𝟙' => '1',
3370
+ '𝟚' => '2',
3371
+ '𝟛' => '3',
3372
+ '𝟜' => '4',
3373
+ '𝟝' => '5',
3374
+ '𝟞' => '6',
3375
+ '𝟟' => '7',
3376
+ '𝟠' => '8',
3377
+ '𝟡' => '9',
3378
+ '𝟢' => '0',
3379
+ '𝟣' => '1',
3380
+ '𝟤' => '2',
3381
+ '𝟥' => '3',
3382
+ '𝟦' => '4',
3383
+ '𝟧' => '5',
3384
+ '𝟨' => '6',
3385
+ '𝟩' => '7',
3386
+ '𝟪' => '8',
3387
+ '𝟫' => '9',
3388
+ '𝟬' => '0',
3389
+ '𝟭' => '1',
3390
+ '𝟮' => '2',
3391
+ '𝟯' => '3',
3392
+ '𝟰' => '4',
3393
+ '𝟱' => '5',
3394
+ '𝟲' => '6',
3395
+ '𝟳' => '7',
3396
+ '𝟴' => '8',
3397
+ '𝟵' => '9',
3398
+ '𝟶' => '0',
3399
+ '𝟷' => '1',
3400
+ '𝟸' => '2',
3401
+ '𝟹' => '3',
3402
+ '𝟺' => '4',
3403
+ '𝟻' => '5',
3404
+ '𝟼' => '6',
3405
+ '𝟽' => '7',
3406
+ '𝟾' => '8',
3407
+ '𝟿' => '9',
3408
+ '𞸀' => 'ا',
3409
+ '𞸁' => 'ب',
3410
+ '𞸂' => 'ج',
3411
+ '𞸃' => 'د',
3412
+ '𞸅' => 'و',
3413
+ '𞸆' => 'ز',
3414
+ '𞸇' => 'ح',
3415
+ '𞸈' => 'ط',
3416
+ '𞸉' => 'ي',
3417
+ '𞸊' => 'ك',
3418
+ '𞸋' => 'ل',
3419
+ '𞸌' => 'م',
3420
+ '𞸍' => 'ن',
3421
+ '𞸎' => 'س',
3422
+ '𞸏' => 'ع',
3423
+ '𞸐' => 'ف',
3424
+ '𞸑' => 'ص',
3425
+ '𞸒' => 'ق',
3426
+ '𞸓' => 'ر',
3427
+ '𞸔' => 'ش',
3428
+ '𞸕' => 'ت',
3429
+ '𞸖' => 'ث',
3430
+ '𞸗' => 'خ',
3431
+ '𞸘' => 'ذ',
3432
+ '𞸙' => 'ض',
3433
+ '𞸚' => 'ظ',
3434
+ '𞸛' => 'غ',
3435
+ '𞸜' => 'ٮ',
3436
+ '𞸝' => 'ں',
3437
+ '𞸞' => 'ڡ',
3438
+ '𞸟' => 'ٯ',
3439
+ '𞸡' => 'ب',
3440
+ '𞸢' => 'ج',
3441
+ '𞸤' => 'ه',
3442
+ '𞸧' => 'ح',
3443
+ '𞸩' => 'ي',
3444
+ '𞸪' => 'ك',
3445
+ '𞸫' => 'ل',
3446
+ '𞸬' => 'م',
3447
+ '𞸭' => 'ن',
3448
+ '𞸮' => 'س',
3449
+ '𞸯' => 'ع',
3450
+ '𞸰' => 'ف',
3451
+ '𞸱' => 'ص',
3452
+ '𞸲' => 'ق',
3453
+ '𞸴' => 'ش',
3454
+ '𞸵' => 'ت',
3455
+ '𞸶' => 'ث',
3456
+ '𞸷' => 'خ',
3457
+ '𞸹' => 'ض',
3458
+ '𞸻' => 'غ',
3459
+ '𞹂' => 'ج',
3460
+ '𞹇' => 'ح',
3461
+ '𞹉' => 'ي',
3462
+ '𞹋' => 'ل',
3463
+ '𞹍' => 'ن',
3464
+ '𞹎' => 'س',
3465
+ '𞹏' => 'ع',
3466
+ '𞹑' => 'ص',
3467
+ '𞹒' => 'ق',
3468
+ '𞹔' => 'ش',
3469
+ '𞹗' => 'خ',
3470
+ '𞹙' => 'ض',
3471
+ '𞹛' => 'غ',
3472
+ '𞹝' => 'ں',
3473
+ '𞹟' => 'ٯ',
3474
+ '𞹡' => 'ب',
3475
+ '𞹢' => 'ج',
3476
+ '𞹤' => 'ه',
3477
+ '𞹧' => 'ح',
3478
+ '𞹨' => 'ط',
3479
+ '𞹩' => 'ي',
3480
+ '𞹪' => 'ك',
3481
+ '𞹬' => 'م',
3482
+ '𞹭' => 'ن',
3483
+ '𞹮' => 'س',
3484
+ '𞹯' => 'ع',
3485
+ '𞹰' => 'ف',
3486
+ '𞹱' => 'ص',
3487
+ '𞹲' => 'ق',
3488
+ '𞹴' => 'ش',
3489
+ '𞹵' => 'ت',
3490
+ '𞹶' => 'ث',
3491
+ '𞹷' => 'خ',
3492
+ '𞹹' => 'ض',
3493
+ '𞹺' => 'ظ',
3494
+ '𞹻' => 'غ',
3495
+ '𞹼' => 'ٮ',
3496
+ '𞹾' => 'ڡ',
3497
+ '𞺀' => 'ا',
3498
+ '𞺁' => 'ب',
3499
+ '𞺂' => 'ج',
3500
+ '𞺃' => 'د',
3501
+ '𞺄' => 'ه',
3502
+ '𞺅' => 'و',
3503
+ '𞺆' => 'ز',
3504
+ '𞺇' => 'ح',
3505
+ '𞺈' => 'ط',
3506
+ '𞺉' => 'ي',
3507
+ '𞺋' => 'ل',
3508
+ '𞺌' => 'م',
3509
+ '𞺍' => 'ن',
3510
+ '𞺎' => 'س',
3511
+ '𞺏' => 'ع',
3512
+ '𞺐' => 'ف',
3513
+ '𞺑' => 'ص',
3514
+ '𞺒' => 'ق',
3515
+ '𞺓' => 'ر',
3516
+ '𞺔' => 'ش',
3517
+ '𞺕' => 'ت',
3518
+ '𞺖' => 'ث',
3519
+ '𞺗' => 'خ',
3520
+ '𞺘' => 'ذ',
3521
+ '𞺙' => 'ض',
3522
+ '𞺚' => 'ظ',
3523
+ '𞺛' => 'غ',
3524
+ '𞺡' => 'ب',
3525
+ '𞺢' => 'ج',
3526
+ '𞺣' => 'د',
3527
+ '𞺥' => 'و',
3528
+ '𞺦' => 'ز',
3529
+ '𞺧' => 'ح',
3530
+ '𞺨' => 'ط',
3531
+ '𞺩' => 'ي',
3532
+ '𞺫' => 'ل',
3533
+ '𞺬' => 'م',
3534
+ '𞺭' => 'ن',
3535
+ '𞺮' => 'س',
3536
+ '𞺯' => 'ع',
3537
+ '𞺰' => 'ف',
3538
+ '𞺱' => 'ص',
3539
+ '𞺲' => 'ق',
3540
+ '𞺳' => 'ر',
3541
+ '𞺴' => 'ش',
3542
+ '𞺵' => 'ت',
3543
+ '𞺶' => 'ث',
3544
+ '𞺷' => 'خ',
3545
+ '𞺸' => 'ذ',
3546
+ '𞺹' => 'ض',
3547
+ '𞺺' => 'ظ',
3548
+ '𞺻' => 'غ',
3549
+ '🄀' => '0.',
3550
+ '🄁' => '0,',
3551
+ '🄂' => '1,',
3552
+ '🄃' => '2,',
3553
+ '🄄' => '3,',
3554
+ '🄅' => '4,',
3555
+ '🄆' => '5,',
3556
+ '🄇' => '6,',
3557
+ '🄈' => '7,',
3558
+ '🄉' => '8,',
3559
+ '🄊' => '9,',
3560
+ '🄐' => '(A)',
3561
+ '🄑' => '(B)',
3562
+ '🄒' => '(C)',
3563
+ '🄓' => '(D)',
3564
+ '🄔' => '(E)',
3565
+ '🄕' => '(F)',
3566
+ '🄖' => '(G)',
3567
+ '🄗' => '(H)',
3568
+ '🄘' => '(I)',
3569
+ '🄙' => '(J)',
3570
+ '🄚' => '(K)',
3571
+ '🄛' => '(L)',
3572
+ '🄜' => '(M)',
3573
+ '🄝' => '(N)',
3574
+ '🄞' => '(O)',
3575
+ '🄟' => '(P)',
3576
+ '🄠' => '(Q)',
3577
+ '🄡' => '(R)',
3578
+ '🄢' => '(S)',
3579
+ '🄣' => '(T)',
3580
+ '🄤' => '(U)',
3581
+ '🄥' => '(V)',
3582
+ '🄦' => '(W)',
3583
+ '🄧' => '(X)',
3584
+ '🄨' => '(Y)',
3585
+ '🄩' => '(Z)',
3586
+ '🄪' => '〔S〕',
3587
+ '🄫' => 'C',
3588
+ '🄬' => 'R',
3589
+ '🄭' => 'CD',
3590
+ '🄮' => 'WZ',
3591
+ '🄰' => 'A',
3592
+ '🄱' => 'B',
3593
+ '🄲' => 'C',
3594
+ '🄳' => 'D',
3595
+ '🄴' => 'E',
3596
+ '🄵' => 'F',
3597
+ '🄶' => 'G',
3598
+ '🄷' => 'H',
3599
+ '🄸' => 'I',
3600
+ '🄹' => 'J',
3601
+ '🄺' => 'K',
3602
+ '🄻' => 'L',
3603
+ '🄼' => 'M',
3604
+ '🄽' => 'N',
3605
+ '🄾' => 'O',
3606
+ '🄿' => 'P',
3607
+ '🅀' => 'Q',
3608
+ '🅁' => 'R',
3609
+ '🅂' => 'S',
3610
+ '🅃' => 'T',
3611
+ '🅄' => 'U',
3612
+ '🅅' => 'V',
3613
+ '🅆' => 'W',
3614
+ '🅇' => 'X',
3615
+ '🅈' => 'Y',
3616
+ '🅉' => 'Z',
3617
+ '🅊' => 'HV',
3618
+ '🅋' => 'MV',
3619
+ '🅌' => 'SD',
3620
+ '🅍' => 'SS',
3621
+ '🅎' => 'PPV',
3622
+ '🅏' => 'WC',
3623
+ '🅪' => 'MC',
3624
+ '🅫' => 'MD',
3625
+ '🅬' => 'MR',
3626
+ '🆐' => 'DJ',
3627
+ '🈀' => 'ほか',
3628
+ '🈁' => 'ココ',
3629
+ '🈂' => 'サ',
3630
+ '🈐' => '手',
3631
+ '🈑' => '字',
3632
+ '🈒' => '双',
3633
+ '🈓' => 'デ',
3634
+ '🈔' => '二',
3635
+ '🈕' => '多',
3636
+ '🈖' => '解',
3637
+ '🈗' => '天',
3638
+ '🈘' => '交',
3639
+ '🈙' => '映',
3640
+ '🈚' => '無',
3641
+ '🈛' => '料',
3642
+ '🈜' => '前',
3643
+ '🈝' => '後',
3644
+ '🈞' => '再',
3645
+ '🈟' => '新',
3646
+ '🈠' => '初',
3647
+ '🈡' => '終',
3648
+ '🈢' => '生',
3649
+ '🈣' => '販',
3650
+ '🈤' => '声',
3651
+ '🈥' => '吹',
3652
+ '🈦' => '演',
3653
+ '🈧' => '投',
3654
+ '🈨' => '捕',
3655
+ '🈩' => '一',
3656
+ '🈪' => '三',
3657
+ '🈫' => '遊',
3658
+ '🈬' => '左',
3659
+ '🈭' => '中',
3660
+ '🈮' => '右',
3661
+ '🈯' => '指',
3662
+ '🈰' => '走',
3663
+ '🈱' => '打',
3664
+ '🈲' => '禁',
3665
+ '🈳' => '空',
3666
+ '🈴' => '合',
3667
+ '🈵' => '満',
3668
+ '🈶' => '有',
3669
+ '🈷' => '月',
3670
+ '🈸' => '申',
3671
+ '🈹' => '割',
3672
+ '🈺' => '営',
3673
+ '🈻' => '配',
3674
+ '🉀' => '〔本〕',
3675
+ '🉁' => '〔三〕',
3676
+ '🉂' => '〔二〕',
3677
+ '🉃' => '〔安〕',
3678
+ '🉄' => '〔点〕',
3679
+ '🉅' => '〔打〕',
3680
+ '🉆' => '〔盗〕',
3681
+ '🉇' => '〔勝〕',
3682
+ '🉈' => '〔敗〕',
3683
+ '🉐' => '得',
3684
+ '🉑' => '可',
3685
+ '🯰' => '0',
3686
+ '🯱' => '1',
3687
+ '🯲' => '2',
3688
+ '🯳' => '3',
3689
+ '🯴' => '4',
3690
+ '🯵' => '5',
3691
+ '🯶' => '6',
3692
+ '🯷' => '7',
3693
+ '🯸' => '8',
3694
+ '🯹' => '9',
3695
+ );
vendor/symfony/polyfill-intl-normalizer/bootstrap.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Intl\Normalizer as p;
13
+
14
+ if (\PHP_VERSION_ID >= 80000) {
15
+ return require __DIR__.'/bootstrap80.php';
16
+ }
17
+
18
+ if (!function_exists('normalizer_is_normalized')) {
19
+ function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); }
20
+ }
21
+ if (!function_exists('normalizer_normalize')) {
22
+ function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); }
23
+ }
vendor/symfony/polyfill-intl-normalizer/bootstrap80.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Intl\Normalizer as p;
13
+
14
+ if (!function_exists('normalizer_is_normalized')) {
15
+ function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C): bool { return p\Normalizer::isNormalized((string) $string, (int) $form); }
16
+ }
17
+ if (!function_exists('normalizer_normalize')) {
18
+ function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize((string) $string, (int) $form); }
19
+ }
vendor/symfony/polyfill-intl-normalizer/composer.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-intl-normalizer",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
5
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Nicolas Grekas",
11
+ "email": "p@tchwork.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=7.1"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" },
23
+ "files": [ "bootstrap.php" ],
24
+ "classmap": [ "Resources/stubs" ]
25
+ },
26
+ "suggest": {
27
+ "ext-intl": "For best performance"
28
+ },
29
+ "minimum-stability": "dev",
30
+ "extra": {
31
+ "branch-alias": {
32
+ "dev-main": "1.22-dev"
33
+ },
34
+ "thanks": {
35
+ "name": "symfony/polyfill",
36
+ "url": "https://github.com/symfony/polyfill"
37
+ }
38
+ }
39
+ }
vendor/symfony/polyfill-mbstring/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2015-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-mbstring/Mbstring.php ADDED
@@ -0,0 +1,869 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ namespace Symfony\Polyfill\Mbstring;
13
+
14
+ /**
15
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
16
+ *
17
+ * Implemented:
18
+ * - mb_chr - Returns a specific character from its Unicode code point
19
+ * - mb_convert_encoding - Convert character encoding
20
+ * - mb_convert_variables - Convert character code in variable(s)
21
+ * - mb_decode_mimeheader - Decode string in MIME header field
22
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
23
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
24
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
25
+ * - mb_convert_case - Perform case folding on a string
26
+ * - mb_detect_encoding - Detect character encoding
27
+ * - mb_get_info - Get internal settings of mbstring
28
+ * - mb_http_input - Detect HTTP input character encoding
29
+ * - mb_http_output - Set/Get HTTP output character encoding
30
+ * - mb_internal_encoding - Set/Get internal character encoding
31
+ * - mb_list_encodings - Returns an array of all supported encodings
32
+ * - mb_ord - Returns the Unicode code point of a character
33
+ * - mb_output_handler - Callback function converts character encoding in output buffer
34
+ * - mb_scrub - Replaces ill-formed byte sequences with substitute characters
35
+ * - mb_strlen - Get string length
36
+ * - mb_strpos - Find position of first occurrence of string in a string
37
+ * - mb_strrpos - Find position of last occurrence of a string in a string
38
+ * - mb_str_split - Convert a string to an array
39
+ * - mb_strtolower - Make a string lowercase
40
+ * - mb_strtoupper - Make a string uppercase
41
+ * - mb_substitute_character - Set/Get substitution character
42
+ * - mb_substr - Get part of string
43
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
44
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
45
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
46
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
47
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
48
+ * - mb_strstr - Finds first occurrence of a string within another
49
+ * - mb_strwidth - Return width of string
50
+ * - mb_substr_count - Count the number of substring occurrences
51
+ *
52
+ * Not implemented:
53
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
54
+ * - mb_ereg_* - Regular expression with multibyte support
55
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
56
+ * - mb_preferred_mime_name - Get MIME charset string
57
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
58
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
59
+ * - mb_send_mail - Send encoded mail
60
+ * - mb_split - Split multibyte string using regular expression
61
+ * - mb_strcut - Get part of string
62
+ * - mb_strimwidth - Get truncated string with specified width
63
+ *
64
+ * @author Nicolas Grekas <p@tchwork.com>
65
+ *
66
+ * @internal
67
+ */
68
+ final class Mbstring
69
+ {
70
+ public const MB_CASE_FOLD = \PHP_INT_MAX;
71
+
72
+ private static $encodingList = ['ASCII', 'UTF-8'];
73
+ private static $language = 'neutral';
74
+ private static $internalEncoding = 'UTF-8';
75
+ private static $caseFold = [
76
+ ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"],
77
+ ['μ', '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);
86
+ }
87
+
88
+ $toEncoding = self::getEncoding($toEncoding);
89
+
90
+ if ('BASE64' === $fromEncoding) {
91
+ $s = base64_decode($s);
92
+ $fromEncoding = $toEncoding;
93
+ }
94
+
95
+ if ('BASE64' === $toEncoding) {
96
+ return base64_encode($s);
97
+ }
98
+
99
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
100
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
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]+/', [__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, &...$vars)
119
+ {
120
+ $ok = true;
121
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
122
+ if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
123
+ $ok = false;
124
+ }
125
+ });
126
+
127
+ return $ok ? $fromEncoding : false;
128
+ }
129
+
130
+ public static function mb_decode_mimeheader($s)
131
+ {
132
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
133
+ }
134
+
135
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
136
+ {
137
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING);
138
+ }
139
+
140
+ public static function mb_decode_numericentity($s, $convmap, $encoding = null)
141
+ {
142
+ if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
143
+ trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
144
+
145
+ return null;
146
+ }
147
+
148
+ if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
149
+ return false;
150
+ }
151
+
152
+ if (null !== $encoding && !is_scalar($encoding)) {
153
+ trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
154
+
155
+ return ''; // Instead of null (cf. mb_encode_numericentity).
156
+ }
157
+
158
+ $s = (string) $s;
159
+ if ('' === $s) {
160
+ return '';
161
+ }
162
+
163
+ $encoding = self::getEncoding($encoding);
164
+
165
+ if ('UTF-8' === $encoding) {
166
+ $encoding = null;
167
+ if (!preg_match('//u', $s)) {
168
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
169
+ }
170
+ } else {
171
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
172
+ }
173
+
174
+ $cnt = floor(\count($convmap) / 4) * 4;
175
+
176
+ for ($i = 0; $i < $cnt; $i += 4) {
177
+ // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
178
+ $convmap[$i] += $convmap[$i + 2];
179
+ $convmap[$i + 1] += $convmap[$i + 2];
180
+ }
181
+
182
+ $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
183
+ $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
184
+ for ($i = 0; $i < $cnt; $i += 4) {
185
+ if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
186
+ return self::mb_chr($c - $convmap[$i + 2]);
187
+ }
188
+ }
189
+
190
+ return $m[0];
191
+ }, $s);
192
+
193
+ if (null === $encoding) {
194
+ return $s;
195
+ }
196
+
197
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
198
+ }
199
+
200
+ public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
201
+ {
202
+ if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
203
+ trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
204
+
205
+ return null;
206
+ }
207
+
208
+ if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) {
209
+ return false;
210
+ }
211
+
212
+ if (null !== $encoding && !is_scalar($encoding)) {
213
+ trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
214
+
215
+ return null; // Instead of '' (cf. mb_decode_numericentity).
216
+ }
217
+
218
+ if (null !== $is_hex && !is_scalar($is_hex)) {
219
+ trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);
220
+
221
+ return null;
222
+ }
223
+
224
+ $s = (string) $s;
225
+ if ('' === $s) {
226
+ return '';
227
+ }
228
+
229
+ $encoding = self::getEncoding($encoding);
230
+
231
+ if ('UTF-8' === $encoding) {
232
+ $encoding = null;
233
+ if (!preg_match('//u', $s)) {
234
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
235
+ }
236
+ } else {
237
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
238
+ }
239
+
240
+ static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
241
+
242
+ $cnt = floor(\count($convmap) / 4) * 4;
243
+ $i = 0;
244
+ $len = \strlen($s);
245
+ $result = '';
246
+
247
+ while ($i < $len) {
248
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
249
+ $uchr = substr($s, $i, $ulen);
250
+ $i += $ulen;
251
+ $c = self::mb_ord($uchr);
252
+
253
+ for ($j = 0; $j < $cnt; $j += 4) {
254
+ if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
255
+ $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
256
+ $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
257
+ continue 2;
258
+ }
259
+ }
260
+ $result .= $uchr;
261
+ }
262
+
263
+ if (null === $encoding) {
264
+ return $result;
265
+ }
266
+
267
+ return iconv('UTF-8', $encoding.'//IGNORE', $result);
268
+ }
269
+
270
+ public static function mb_convert_case($s, $mode, $encoding = null)
271
+ {
272
+ $s = (string) $s;
273
+ if ('' === $s) {
274
+ return '';
275
+ }
276
+
277
+ $encoding = self::getEncoding($encoding);
278
+
279
+ if ('UTF-8' === $encoding) {
280
+ $encoding = null;
281
+ if (!preg_match('//u', $s)) {
282
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
283
+ }
284
+ } else {
285
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
286
+ }
287
+
288
+ if (\MB_CASE_TITLE == $mode) {
289
+ static $titleRegexp = null;
290
+ if (null === $titleRegexp) {
291
+ $titleRegexp = self::getData('titleCaseRegexp');
292
+ }
293
+ $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s);
294
+ } else {
295
+ if (\MB_CASE_UPPER == $mode) {
296
+ static $upper = null;
297
+ if (null === $upper) {
298
+ $upper = self::getData('upperCase');
299
+ }
300
+ $map = $upper;
301
+ } else {
302
+ if (self::MB_CASE_FOLD === $mode) {
303
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
304
+ }
305
+
306
+ static $lower = null;
307
+ if (null === $lower) {
308
+ $lower = self::getData('lowerCase');
309
+ }
310
+ $map = $lower;
311
+ }
312
+
313
+ static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
314
+
315
+ $i = 0;
316
+ $len = \strlen($s);
317
+
318
+ while ($i < $len) {
319
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
320
+ $uchr = substr($s, $i, $ulen);
321
+ $i += $ulen;
322
+
323
+ if (isset($map[$uchr])) {
324
+ $uchr = $map[$uchr];
325
+ $nlen = \strlen($uchr);
326
+
327
+ if ($nlen == $ulen) {
328
+ $nlen = $i;
329
+ do {
330
+ $s[--$nlen] = $uchr[--$ulen];
331
+ } while ($ulen);
332
+ } else {
333
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
334
+ $len += $nlen - $ulen;
335
+ $i += $nlen - $ulen;
336
+ }
337
+ }
338
+ }
339
+ }
340
+
341
+ if (null === $encoding) {
342
+ return $s;
343
+ }
344
+
345
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
346
+ }
347
+
348
+ public static function mb_internal_encoding($encoding = null)
349
+ {
350
+ if (null === $encoding) {
351
+ return self::$internalEncoding;
352
+ }
353
+
354
+ $normalizedEncoding = self::getEncoding($encoding);
355
+
356
+ if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
357
+ self::$internalEncoding = $normalizedEncoding;
358
+
359
+ return true;
360
+ }
361
+
362
+ if (80000 > \PHP_VERSION_ID) {
363
+ return false;
364
+ }
365
+
366
+ throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding));
367
+ }
368
+
369
+ public static function mb_language($lang = null)
370
+ {
371
+ if (null === $lang) {
372
+ return self::$language;
373
+ }
374
+
375
+ switch ($normalizedLang = strtolower($lang)) {
376
+ case 'uni':
377
+ case 'neutral':
378
+ self::$language = $normalizedLang;
379
+
380
+ return true;
381
+ }
382
+
383
+ if (80000 > \PHP_VERSION_ID) {
384
+ return false;
385
+ }
386
+
387
+ throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang));
388
+ }
389
+
390
+ public static function mb_list_encodings()
391
+ {
392
+ return ['UTF-8'];
393
+ }
394
+
395
+ public static function mb_encoding_aliases($encoding)
396
+ {
397
+ switch (strtoupper($encoding)) {
398
+ case 'UTF8':
399
+ case 'UTF-8':
400
+ return ['utf8'];
401
+ }
402
+
403
+ return false;
404
+ }
405
+
406
+ public static function mb_check_encoding($var = null, $encoding = null)
407
+ {
408
+ if (null === $encoding) {
409
+ if (null === $var) {
410
+ return false;
411
+ }
412
+ $encoding = self::$internalEncoding;
413
+ }
414
+
415
+ return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);
416
+ }
417
+
418
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
419
+ {
420
+ if (null === $encodingList) {
421
+ $encodingList = self::$encodingList;
422
+ } else {
423
+ if (!\is_array($encodingList)) {
424
+ $encodingList = array_map('trim', explode(',', $encodingList));
425
+ }
426
+ $encodingList = array_map('strtoupper', $encodingList);
427
+ }
428
+
429
+ foreach ($encodingList as $enc) {
430
+ switch ($enc) {
431
+ case 'ASCII':
432
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
433
+ return $enc;
434
+ }
435
+ break;
436
+
437
+ case 'UTF8':
438
+ case 'UTF-8':
439
+ if (preg_match('//u', $str)) {
440
+ return 'UTF-8';
441
+ }
442
+ break;
443
+
444
+ default:
445
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
446
+ return $enc;
447
+ }
448
+ }
449
+ }
450
+
451
+ return false;
452
+ }
453
+
454
+ public static function mb_detect_order($encodingList = null)
455
+ {
456
+ if (null === $encodingList) {
457
+ return self::$encodingList;
458
+ }
459
+
460
+ if (!\is_array($encodingList)) {
461
+ $encodingList = array_map('trim', explode(',', $encodingList));
462
+ }
463
+ $encodingList = array_map('strtoupper', $encodingList);
464
+
465
+ foreach ($encodingList as $enc) {
466
+ switch ($enc) {
467
+ default:
468
+ if (strncmp($enc, 'ISO-8859-', 9)) {
469
+ return false;
470
+ }
471
+ // no break
472
+ case 'ASCII':
473
+ case 'UTF8':
474
+ case 'UTF-8':
475
+ }
476
+ }
477
+
478
+ self::$encodingList = $encodingList;
479
+
480
+ return true;
481
+ }
482
+
483
+ public static function mb_strlen($s, $encoding = null)
484
+ {
485
+ $encoding = self::getEncoding($encoding);
486
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
487
+ return \strlen($s);
488
+ }
489
+
490
+ return @iconv_strlen($s, $encoding);
491
+ }
492
+
493
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
494
+ {
495
+ $encoding = self::getEncoding($encoding);
496
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
497
+ return strpos($haystack, $needle, $offset);
498
+ }
499
+
500
+ $needle = (string) $needle;
501
+ if ('' === $needle) {
502
+ if (80000 > \PHP_VERSION_ID) {
503
+ trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING);
504
+
505
+ return false;
506
+ }
507
+
508
+ return 0;
509
+ }
510
+
511
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
512
+ }
513
+
514
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
515
+ {
516
+ $encoding = self::getEncoding($encoding);
517
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
518
+ return strrpos($haystack, $needle, $offset);
519
+ }
520
+
521
+ if ($offset != (int) $offset) {
522
+ $offset = 0;
523
+ } elseif ($offset = (int) $offset) {
524
+ if ($offset < 0) {
525
+ if (0 > $offset += self::mb_strlen($needle)) {
526
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
527
+ }
528
+ $offset = 0;
529
+ } else {
530
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
531
+ }
532
+ }
533
+
534
+ $pos = '' !== $needle || 80000 > \PHP_VERSION_ID
535
+ ? iconv_strrpos($haystack, $needle, $encoding)
536
+ : self::mb_strlen($haystack, $encoding);
537
+
538
+ return false !== $pos ? $offset + $pos : false;
539
+ }
540
+
541
+ public static function mb_str_split($string, $split_length = 1, $encoding = null)
542
+ {
543
+ if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
544
+ trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);
545
+
546
+ return null;
547
+ }
548
+
549
+ if (1 > $split_length = (int) $split_length) {
550
+ if (80000 > \PHP_VERSION_ID) {
551
+ trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);
552
+ return false;
553
+ }
554
+
555
+ throw new \ValueError('Argument #2 ($length) must be greater than 0');
556
+ }
557
+
558
+ if (null === $encoding) {
559
+ $encoding = mb_internal_encoding();
560
+ }
561
+
562
+ if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
563
+ $rx = '/(';
564
+ while (65535 < $split_length) {
565
+ $rx .= '.{65535}';
566
+ $split_length -= 65535;
567
+ }
568
+ $rx .= '.{'.$split_length.'})/us';
569
+
570
+ return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
571
+ }
572
+
573
+ $result = [];
574
+ $length = mb_strlen($string, $encoding);
575
+
576
+ for ($i = 0; $i < $length; $i += $split_length) {
577
+ $result[] = mb_substr($string, $i, $split_length, $encoding);
578
+ }
579
+
580
+ return $result;
581
+ }
582
+
583
+ public static function mb_strtolower($s, $encoding = null)
584
+ {
585
+ return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding);
586
+ }
587
+
588
+ public static function mb_strtoupper($s, $encoding = null)
589
+ {
590
+ return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding);
591
+ }
592
+
593
+ public static function mb_substitute_character($c = null)
594
+ {
595
+ if (null === $c) {
596
+ return 'none';
597
+ }
598
+ if (0 === strcasecmp($c, 'none')) {
599
+ return true;
600
+ }
601
+ if (80000 > \PHP_VERSION_ID) {
602
+ return false;
603
+ }
604
+
605
+ throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint');
606
+ }
607
+
608
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
609
+ {
610
+ $encoding = self::getEncoding($encoding);
611
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
612
+ return (string) substr($s, $start, null === $length ? 2147483647 : $length);
613
+ }
614
+
615
+ if ($start < 0) {
616
+ $start = iconv_strlen($s, $encoding) + $start;
617
+ if ($start < 0) {
618
+ $start = 0;
619
+ }
620
+ }
621
+
622
+ if (null === $length) {
623
+ $length = 2147483647;
624
+ } elseif ($length < 0) {
625
+ $length = iconv_strlen($s, $encoding) + $length - $start;
626
+ if ($length < 0) {
627
+ return '';
628
+ }
629
+ }
630
+
631
+ return (string) iconv_substr($s, $start, $length, $encoding);
632
+ }
633
+
634
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
635
+ {
636
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
637
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
638
+
639
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
640
+ }
641
+
642
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
643
+ {
644
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
645
+
646
+ return self::getSubpart($pos, $part, $haystack, $encoding);
647
+ }
648
+
649
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
650
+ {
651
+ $encoding = self::getEncoding($encoding);
652
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
653
+ $pos = strrpos($haystack, $needle);
654
+ } else {
655
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
656
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
657
+ }
658
+
659
+ return self::getSubpart($pos, $part, $haystack, $encoding);
660
+ }
661
+
662
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
663
+ {
664
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
665
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
666
+
667
+ return self::getSubpart($pos, $part, $haystack, $encoding);
668
+ }
669
+
670
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
671
+ {
672
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
673
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
674
+
675
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
676
+ }
677
+
678
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
679
+ {
680
+ $pos = strpos($haystack, $needle);
681
+ if (false === $pos) {
682
+ return false;
683
+ }
684
+ if ($part) {
685
+ return substr($haystack, 0, $pos);
686
+ }
687
+
688
+ return substr($haystack, $pos);
689
+ }
690
+
691
+ public static function mb_get_info($type = 'all')
692
+ {
693
+ $info = [
694
+ 'internal_encoding' => self::$internalEncoding,
695
+ 'http_output' => 'pass',
696
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
697
+ 'func_overload' => 0,
698
+ 'func_overload_list' => 'no overload',
699
+ 'mail_charset' => 'UTF-8',
700
+ 'mail_header_encoding' => 'BASE64',
701
+ 'mail_body_encoding' => 'BASE64',
702
+ 'illegal_chars' => 0,
703
+ 'encoding_translation' => 'Off',
704
+ 'language' => self::$language,
705
+ 'detect_order' => self::$encodingList,
706
+ 'substitute_character' => 'none',
707
+ 'strict_detection' => 'Off',
708
+ ];
709
+
710
+ if ('all' === $type) {
711
+ return $info;
712
+ }
713
+ if (isset($info[$type])) {
714
+ return $info[$type];
715
+ }
716
+
717
+ return false;
718
+ }
719
+
720
+ public static function mb_http_input($type = '')
721
+ {
722
+ return false;
723
+ }
724
+
725
+ public static function mb_http_output($encoding = null)
726
+ {
727
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
728
+ }
729
+
730
+ public static function mb_strwidth($s, $encoding = null)
731
+ {
732
+ $encoding = self::getEncoding($encoding);
733
+
734
+ if ('UTF-8' !== $encoding) {
735
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
736
+ }
737
+
738
+ $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);
739
+
740
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
741
+ }
742
+
743
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
744
+ {
745
+ return substr_count($haystack, $needle);
746
+ }
747
+
748
+ public static function mb_output_handler($contents, $status)
749
+ {
750
+ return $contents;
751
+ }
752
+
753
+ public static function mb_chr($code, $encoding = null)
754
+ {
755
+ if (0x80 > $code %= 0x200000) {
756
+ $s = \chr($code);
757
+ } elseif (0x800 > $code) {
758
+ $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
759
+ } elseif (0x10000 > $code) {
760
+ $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
761
+ } else {
762
+ $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
763
+ }
764
+
765
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
766
+ $s = mb_convert_encoding($s, $encoding, 'UTF-8');
767
+ }
768
+
769
+ return $s;
770
+ }
771
+
772
+ public static function mb_ord($s, $encoding = null)
773
+ {
774
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
775
+ $s = mb_convert_encoding($s, 'UTF-8', $encoding);
776
+ }
777
+
778
+ if (1 === \strlen($s)) {
779
+ return \ord($s);
780
+ }
781
+
782
+ $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
783
+ if (0xF0 <= $code) {
784
+ return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
785
+ }
786
+ if (0xE0 <= $code) {
787
+ return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
788
+ }
789
+ if (0xC0 <= $code) {
790
+ return (($code - 0xC0) << 6) + $s[2] - 0x80;
791
+ }
792
+
793
+ return $code;
794
+ }
795
+
796
+ private static function getSubpart($pos, $part, $haystack, $encoding)
797
+ {
798
+ if (false === $pos) {
799
+ return false;
800
+ }
801
+ if ($part) {
802
+ return self::mb_substr($haystack, 0, $pos, $encoding);
803
+ }
804
+
805
+ return self::mb_substr($haystack, $pos, null, $encoding);
806
+ }
807
+
808
+ private static function html_encoding_callback(array $m)
809
+ {
810
+ $i = 1;
811
+ $entities = '';
812
+ $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8'));
813
+
814
+ while (isset($m[$i])) {
815
+ if (0x80 > $m[$i]) {
816
+ $entities .= \chr($m[$i++]);
817
+ continue;
818
+ }
819
+ if (0xF0 <= $m[$i]) {
820
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
821
+ } elseif (0xE0 <= $m[$i]) {
822
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
823
+ } else {
824
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
825
+ }
826
+
827
+ $entities .= '&#'.$c.';';
828
+ }
829
+
830
+ return $entities;
831
+ }
832
+
833
+ private static function title_case(array $s)
834
+ {
835
+ return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8');
836
+ }
837
+
838
+ private static function getData($file)
839
+ {
840
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
841
+ return require $file;
842
+ }
843
+
844
+ return false;
845
+ }
846
+
847
+ private static function getEncoding($encoding)
848
+ {
849
+ if (null === $encoding) {
850
+ return self::$internalEncoding;
851
+ }
852
+
853
+ if ('UTF-8' === $encoding) {
854
+ return 'UTF-8';
855
+ }
856
+
857
+ $encoding = strtoupper($encoding);
858
+
859
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
860
+ return 'CP850';
861
+ }
862
+
863
+ if ('UTF8' === $encoding) {
864
+ return 'UTF-8';
865
+ }
866
+
867
+ return $encoding;
868
+ }
869
+ }
vendor/symfony/polyfill-mbstring/README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Mbstring
2
+ ===========================
3
+
4
+ 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
+ =======
12
+
13
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php ADDED
@@ -0,0 +1,1397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'A' => 'a',
5
+ 'B' => 'b',
6
+ 'C' => 'c',
7
+ 'D' => 'd',
8
+ 'E' => 'e',
9
+ 'F' => 'f',
10
+ 'G' => 'g',
11
+ 'H' => 'h',
12
+ 'I' => 'i',
13
+ 'J' => 'j',
14
+ 'K' => 'k',
15
+ 'L' => 'l',
16
+ 'M' => 'm',
17
+ 'N' => 'n',
18
+ 'O' => 'o',
19
+ 'P' => 'p',
20
+ 'Q' => 'q',
21
+ 'R' => 'r',
22
+ 'S' => 's',
23
+ 'T' => 't',
24
+ 'U' => 'u',
25
+ 'V' => 'v',
26
+ 'W' => 'w',
27
+ 'X' => 'x',
28
+ 'Y' => 'y',
29
+ 'Z' => 'z',
30
+ 'À' => 'à',
31
+ 'Á' => 'á',
32
+ 'Â' => 'â',
33
+ 'Ã' => 'ã',
34
+ 'Ä' => 'ä',
35
+ 'Å' => 'å',
36
+ 'Æ' => 'æ',
37
+ 'Ç' => 'ç',
38
+ 'È' => 'è',
39
+ 'É' => 'é',
40
+ 'Ê' => 'ê',
41
+ 'Ë' => 'ë',
42
+ 'Ì' => 'ì',
43
+ 'Í' => 'í',
44
+ 'Î' => 'î',
45
+ 'Ï' => 'ï',
46
+ 'Ð' => 'ð',
47
+ 'Ñ' => 'ñ',
48
+ 'Ò' => 'ò',
49
+ 'Ó' => 'ó',
50
+ 'Ô' => 'ô',
51
+ 'Õ' => 'õ',
52
+ 'Ö' => 'ö',
53
+ 'Ø' => 'ø',
54
+ 'Ù' => 'ù',
55
+ 'Ú' => 'ú',
56
+ 'Û' => 'û',
57
+ 'Ü' => 'ü',
58
+ 'Ý' => 'ý',
59
+ 'Þ' => 'þ',
60
+ 'Ā' => 'ā',
61
+ 'Ă' => 'ă',
62
+ 'Ą' => 'ą',
63
+ 'Ć' => 'ć',
64
+ 'Ĉ' => 'ĉ',
65
+ 'Ċ' => 'ċ',
66
+ 'Č' => 'č',
67
+ 'Ď' => 'ď',
68
+ 'Đ' => 'đ',
69
+ 'Ē' => 'ē',
70
+ 'Ĕ' => 'ĕ',
71
+ 'Ė' => 'ė',
72
+ 'Ę' => 'ę',
73
+ 'Ě' => 'ě',
74
+ 'Ĝ' => 'ĝ',
75
+ 'Ğ' => 'ğ',
76
+ 'Ġ' => 'ġ',
77
+ 'Ģ' => 'ģ',
78
+ 'Ĥ' => 'ĥ',
79
+ 'Ħ' => 'ħ',
80
+ 'Ĩ' => 'ĩ',
81
+ 'Ī' => 'ī',
82
+ 'Ĭ' => 'ĭ',
83
+ 'Į' => 'į',
84
+ 'İ' => 'i',
85
+ 'IJ' => 'ij',
86
+ 'Ĵ' => 'ĵ',
87
+ 'Ķ' => 'ķ',
88
+ 'Ĺ' => 'ĺ',
89
+ 'Ļ' => 'ļ',
90
+ 'Ľ' => 'ľ',
91
+ 'Ŀ' => 'ŀ',
92
+ 'Ł' => 'ł',
93
+ 'Ń' => 'ń',
94
+ 'Ņ' => 'ņ',
95
+ 'Ň' => 'ň',
96
+ 'Ŋ' => 'ŋ',
97
+ 'Ō' => 'ō',
98
+ 'Ŏ' => 'ŏ',
99
+ 'Ő' => 'ő',
100
+ 'Œ' => 'œ',
101
+ 'Ŕ' => 'ŕ',
102
+ 'Ŗ' => 'ŗ',
103
+ 'Ř' => 'ř',
104
+ 'Ś' => 'ś',
105
+ 'Ŝ' => 'ŝ',
106
+ 'Ş' => 'ş',
107
+ 'Š' => 'š',
108
+ 'Ţ' => 'ţ',
109
+ 'Ť' => 'ť',
110
+ 'Ŧ' => 'ŧ',
111
+ 'Ũ' => 'ũ',
112
+ 'Ū' => 'ū',
113
+ 'Ŭ' => 'ŭ',
114
+ 'Ů' => 'ů',
115
+ 'Ű' => 'ű',
116
+ 'Ų' => 'ų',
117
+ 'Ŵ' => 'ŵ',
118
+ 'Ŷ' => 'ŷ',
119
+ 'Ÿ' => 'ÿ',
120
+ 'Ź' => 'ź',
121
+ 'Ż' => 'ż',
122
+ 'Ž' => 'ž',
123
+ 'Ɓ' => 'ɓ',
124
+ 'Ƃ' => 'ƃ',
125
+ 'Ƅ' => 'ƅ',
126
+ 'Ɔ' => 'ɔ',
127
+ 'Ƈ' => 'ƈ',
128
+ 'Ɖ' => 'ɖ',
129
+ 'Ɗ' => 'ɗ',
130
+ 'Ƌ' => 'ƌ',
131
+ 'Ǝ' => 'ǝ',
132
+ 'Ə' => 'ə',
133
+ 'Ɛ' => 'ɛ',
134
+ 'Ƒ' => 'ƒ',
135
+ 'Ɠ' => 'ɠ',
136
+ 'Ɣ' => 'ɣ',
137
+ 'Ɩ' => 'ɩ',
138
+ 'Ɨ' => 'ɨ',
139
+ 'Ƙ' => 'ƙ',
140
+ 'Ɯ' => 'ɯ',
141
+ 'Ɲ' => 'ɲ',
142
+ 'Ɵ' => 'ɵ',
143
+ 'Ơ' => 'ơ',
144
+ 'Ƣ' => 'ƣ',
145
+ 'Ƥ' => 'ƥ',
146
+ 'Ʀ' => 'ʀ',
147
+ 'Ƨ' => 'ƨ',
148
+ 'Ʃ' => 'ʃ',
149
+ 'Ƭ' => 'ƭ',
150
+ 'Ʈ' => 'ʈ',
151
+ 'Ư' => 'ư',
152
+ 'Ʊ' => 'ʊ',
153
+ 'Ʋ' => 'ʋ',
154
+ 'Ƴ' => 'ƴ',
155
+ 'Ƶ' => 'ƶ',
156
+ 'Ʒ' => 'ʒ',
157
+ 'Ƹ' => 'ƹ',
158
+ 'Ƽ' => 'ƽ',
159
+ 'DŽ' => 'dž',
160
+ 'Dž' => 'dž',
161
+ 'LJ' => 'lj',
162
+ 'Lj' => 'lj',
163
+ 'NJ' => 'nj',
164
+ 'Nj' => 'nj',
165
+ 'Ǎ' => 'ǎ',
166
+ 'Ǐ' => 'ǐ',
167
+ 'Ǒ' => 'ǒ',
168
+ 'Ǔ' => 'ǔ',
169
+ 'Ǖ' => 'ǖ',
170
+ 'Ǘ' => 'ǘ',
171
+ 'Ǚ' => 'ǚ',
172
+ 'Ǜ' => 'ǜ',
173
+ 'Ǟ' => 'ǟ',
174
+ 'Ǡ' => 'ǡ',
175
+ 'Ǣ' => 'ǣ',
176
+ 'Ǥ' => 'ǥ',
177
+ 'Ǧ' => 'ǧ',
178
+ 'Ǩ' => 'ǩ',
179
+ 'Ǫ' => 'ǫ',
180
+ 'Ǭ' => 'ǭ',
181
+ 'Ǯ' => 'ǯ',
182
+ 'DZ' => 'dz',
183
+ 'Dz' => 'dz',
184
+ 'Ǵ' => 'ǵ',
185
+ 'Ƕ' => 'ƕ',
186
+ 'Ƿ' => 'ƿ',
187
+ 'Ǹ' => 'ǹ',
188
+ 'Ǻ' => 'ǻ',
189
+ 'Ǽ' => 'ǽ',
190
+ 'Ǿ' => 'ǿ',
191
+ 'Ȁ' => 'ȁ',
192
+ 'Ȃ' => 'ȃ',
193
+ 'Ȅ' => 'ȅ',
194
+ 'Ȇ' => 'ȇ',
195
+ 'Ȉ' => 'ȉ',
196
+ 'Ȋ' => 'ȋ',
197
+ 'Ȍ' => 'ȍ',
198
+ 'Ȏ' => 'ȏ',
199
+ 'Ȑ' => 'ȑ',
200
+ 'Ȓ' => 'ȓ',
201
+ 'Ȕ' => 'ȕ',
202
+ 'Ȗ' => 'ȗ',
203
+ 'Ș' => 'ș',
204
+ 'Ț' => 'ț',
205
+ 'Ȝ' => 'ȝ',
206
+ 'Ȟ' => 'ȟ',
207
+ 'Ƞ' => 'ƞ',
208
+ 'Ȣ' => 'ȣ',
209
+ 'Ȥ' => 'ȥ',
210
+ 'Ȧ' => 'ȧ',
211
+ 'Ȩ' => 'ȩ',
212
+ 'Ȫ' => 'ȫ',
213
+ 'Ȭ' => 'ȭ',
214
+ 'Ȯ' => 'ȯ',
215
+ 'Ȱ' => 'ȱ',
216
+ 'Ȳ' => 'ȳ',
217
+ 'Ⱥ' => 'ⱥ',
218
+ 'Ȼ' => 'ȼ',
219
+ 'Ƚ' => 'ƚ',
220
+ 'Ⱦ' => 'ⱦ',
221
+ 'Ɂ' => 'ɂ',
222
+ 'Ƀ' => 'ƀ',
223
+ 'Ʉ' => 'ʉ',
224
+ 'Ʌ' => 'ʌ',
225
+ 'Ɇ' => 'ɇ',
226
+ 'Ɉ' => 'ɉ',
227
+ 'Ɋ' => 'ɋ',
228
+ 'Ɍ' => 'ɍ',
229
+ 'Ɏ' => 'ɏ',
230
+ 'Ͱ' => 'ͱ',
231
+ 'Ͳ' => 'ͳ',
232
+ 'Ͷ' => 'ͷ',
233
+ 'Ϳ' => 'ϳ',
234
+ 'Ά' => 'ά',
235
+ 'Έ' => 'έ',
236
+ 'Ή' => 'ή',
237
+ 'Ί' => 'ί',
238
+ 'Ό' => 'ό',
239
+ 'Ύ' => 'ύ',
240
+ 'Ώ' => 'ώ',
241
+ 'Α' => 'α',
242
+ 'Β' => 'β',
243
+ 'Γ' => 'γ',
244
+ 'Δ' => 'δ',
245
+ 'Ε' => 'ε',
246
+ 'Ζ' => 'ζ',
247
+ 'Η' => 'η',
248
+ 'Θ' => 'θ',
249
+ 'Ι' => 'ι',
250
+ 'Κ' => 'κ',
251
+ 'Λ' => 'λ',
252
+ 'Μ' => 'μ',
253
+ 'Ν' => 'ν',
254
+ 'Ξ' => 'ξ',
255
+ 'Ο' => 'ο',
256
+ 'Π' => 'π',
257
+ 'Ρ' => 'ρ',
258
+ 'Σ' => 'σ',
259
+ 'Τ' => 'τ',
260
+ 'Υ' => 'υ',
261
+ 'Φ' => 'φ',
262
+ 'Χ' => 'χ',
263
+ 'Ψ' => 'ψ',
264
+ 'Ω' => 'ω',
265
+ 'Ϊ' => 'ϊ',
266
+ 'Ϋ' => 'ϋ',
267
+ 'Ϗ' => 'ϗ',
268
+ 'Ϙ' => 'ϙ',
269
+ 'Ϛ' => 'ϛ',
270
+ 'Ϝ' => 'ϝ',
271
+ 'Ϟ' => 'ϟ',
272
+ 'Ϡ' => 'ϡ',
273
+ 'Ϣ' => 'ϣ',
274
+ 'Ϥ' => 'ϥ',
275
+ 'Ϧ' => 'ϧ',
276
+ 'Ϩ' => 'ϩ',
277
+ 'Ϫ' => 'ϫ',
278
+ 'Ϭ' => 'ϭ',
279
+ 'Ϯ' => 'ϯ',
280
+ 'ϴ' => 'θ',
281
+ 'Ϸ' => 'ϸ',
282
+ 'Ϲ' => 'ϲ',
283
+ 'Ϻ' => 'ϻ',
284
+ 'Ͻ' => 'ͻ',
285
+ 'Ͼ' => 'ͼ',
286
+ 'Ͽ' => 'ͽ',
287
+ 'Ѐ' => 'ѐ',
288
+ 'Ё' => 'ё',
289
+ 'Ђ' => 'ђ',
290
+ 'Ѓ' => 'ѓ',
291
+ 'Є' => 'є',
292
+ 'Ѕ' => 'ѕ',
293
+ 'І' => 'і',
294
+ 'Ї' => 'ї',
295
+ 'Ј' => 'ј',
296
+ 'Љ' => 'љ',
297
+ 'Њ' => 'њ',
298
+ 'Ћ' => 'ћ',
299
+ 'Ќ' => 'ќ',
300
+ 'Ѝ' => 'ѝ',
301
+ 'Ў' => 'ў',
302
+ 'Џ' => 'џ',
303
+ 'А' => 'а',
304
+ 'Б' => 'б',
305
+ 'В' => 'в',
306
+ 'Г' => 'г',
307
+ 'Д' => 'д',
308
+ 'Е' => 'е',
309
+ 'Ж' => 'ж',
310
+ 'З' => 'з',
311
+ 'И' => 'и',
312
+ 'Й' => 'й',
313
+ 'К' => 'к',
314
+ 'Л' => 'л',
315
+ 'М' => 'м',
316
+ 'Н' => 'н',
317
+ 'О' => 'о',
318
+ 'П' => 'п',
319
+ 'Р' => 'р',
320
+ 'С' => 'с',
321
+ 'Т' => 'т',
322
+ 'У' => 'у',
323
+ 'Ф' => 'ф',
324
+ 'Х' => 'х',
325
+ 'Ц' => 'ц',
326
+ 'Ч' => 'ч',
327
+ 'Ш' => 'ш',
328
+ 'Щ' => 'щ',
329
+ 'Ъ' => 'ъ',
330
+ 'Ы' => 'ы',
331
+ 'Ь' => 'ь',
332
+ 'Э' => 'э',
333
+ 'Ю' => 'ю',
334
+ 'Я' => 'я',
335
+ 'Ѡ' => 'ѡ',
336
+ 'Ѣ' => 'ѣ',
337
+ 'Ѥ' => 'ѥ',
338
+ 'Ѧ' => 'ѧ',
339
+ 'Ѩ' => 'ѩ',
340
+ 'Ѫ' => 'ѫ',
341
+ 'Ѭ' => 'ѭ',
342
+ 'Ѯ' => 'ѯ',
343
+ 'Ѱ' => 'ѱ',
344
+ 'Ѳ' => 'ѳ',
345
+ 'Ѵ' => 'ѵ',
346
+ 'Ѷ' => 'ѷ',
347
+ 'Ѹ' => 'ѹ',
348
+ 'Ѻ' => 'ѻ',
349
+ 'Ѽ' => 'ѽ',
350
+ 'Ѿ' => 'ѿ',
351
+ 'Ҁ' => 'ҁ',
352
+ 'Ҋ' => 'ҋ',
353
+ 'Ҍ' => 'ҍ',
354
+ 'Ҏ' => 'ҏ',
355
+ 'Ґ' => 'ґ',
356
+ 'Ғ' => 'ғ',
357
+ 'Ҕ' => 'ҕ',
358
+ 'Җ' => 'җ',
359
+ 'Ҙ' => 'ҙ',
360
+ 'Қ' => 'қ',
361
+ 'Ҝ' => 'ҝ',
362
+ 'Ҟ' => 'ҟ',
363
+ 'Ҡ' => 'ҡ',
364
+ 'Ң' => 'ң',
365
+ 'Ҥ' => 'ҥ',
366
+ 'Ҧ' => 'ҧ',
367
+ 'Ҩ' => 'ҩ',
368
+ 'Ҫ' => 'ҫ',
369
+ 'Ҭ' => 'ҭ',
370
+ 'Ү' => 'ү',
371
+ 'Ұ' => 'ұ',
372
+ 'Ҳ' => 'ҳ',
373
+ 'Ҵ' => 'ҵ',
374
+ 'Ҷ' => 'ҷ',
375
+ 'Ҹ' => 'ҹ',
376
+ 'Һ' => 'һ',
377
+ 'Ҽ' => 'ҽ',
378
+ 'Ҿ' => 'ҿ',
379
+ 'Ӏ' => 'ӏ',
380
+ 'Ӂ' => 'ӂ',
381
+ 'Ӄ' => 'ӄ',
382
+ 'Ӆ' => 'ӆ',
383
+ 'Ӈ' => 'ӈ',
384
+ 'Ӊ' => 'ӊ',
385
+ 'Ӌ' => 'ӌ',
386
+ 'Ӎ' => 'ӎ',
387
+ 'Ӑ' => 'ӑ',
388
+ 'Ӓ' => 'ӓ',
389
+ 'Ӕ' => 'ӕ',
390
+ 'Ӗ' => 'ӗ',
391
+ 'Ә' => 'ә',
392
+ 'Ӛ' => 'ӛ',
393
+ 'Ӝ' => 'ӝ',
394
+ 'Ӟ' => 'ӟ',
395
+ 'Ӡ' => 'ӡ',
396
+ 'Ӣ' => 'ӣ',
397
+ 'Ӥ' => 'ӥ',
398
+ 'Ӧ' => 'ӧ',
399
+ 'Ө' => 'ө',
400
+ 'Ӫ' => 'ӫ',
401
+ 'Ӭ' => 'ӭ',
402
+ 'Ӯ' => 'ӯ',
403
+ 'Ӱ' => 'ӱ',
404
+ 'Ӳ' => 'ӳ',
405
+ 'Ӵ' => 'ӵ',
406
+ 'Ӷ' => 'ӷ',
407
+ 'Ӹ' => 'ӹ',
408
+ 'Ӻ' => 'ӻ',
409
+ 'Ӽ' => 'ӽ',
410
+ 'Ӿ' => 'ӿ',
411
+ 'Ԁ' => 'ԁ',
412
+ 'Ԃ' => 'ԃ',
413
+ 'Ԅ' => 'ԅ',
414
+ 'Ԇ' => 'ԇ',
415
+ 'Ԉ' => 'ԉ',
416
+ 'Ԋ' => 'ԋ',
417
+ 'Ԍ' => 'ԍ',
418
+ 'Ԏ' => 'ԏ',
419
+ 'Ԑ' => 'ԑ',
420
+ 'Ԓ' => 'ԓ',
421
+ 'Ԕ' => 'ԕ',
422
+ 'Ԗ' => 'ԗ',
423
+ 'Ԙ' => 'ԙ',
424
+ 'Ԛ' => 'ԛ',
425
+ 'Ԝ' => 'ԝ',
426
+ 'Ԟ' => 'ԟ',
427
+ 'Ԡ' => 'ԡ',
428
+ 'Ԣ' => 'ԣ',
429
+ 'Ԥ' => 'ԥ',
430
+ 'Ԧ' => 'ԧ',
431
+ 'Ԩ' => 'ԩ',
432
+ 'Ԫ' => 'ԫ',
433
+ 'Ԭ' => 'ԭ',
434
+ 'Ԯ' => 'ԯ',
435
+ 'Ա' => 'ա',
436
+ 'Բ' => 'բ',
437
+ 'Գ' => 'գ',
438
+ 'Դ' => 'դ',
439
+ 'Ե' => 'ե',
440
+ 'Զ' => 'զ',
441
+ 'Է' => 'է',
442
+ 'Ը' => 'ը',
443
+ 'Թ' => 'թ',
444
+ 'Ժ' => 'ժ',
445
+ 'Ի' => 'ի',
446
+ 'Լ' => 'լ',
447
+ 'Խ' => 'խ',
448
+ 'Ծ' => 'ծ',
449
+ 'Կ' => 'կ',
450
+ 'Հ' => 'հ',
451
+ 'Ձ' => 'ձ',
452
+ 'Ղ' => 'ղ',
453
+ 'Ճ' => 'ճ',
454
+ 'Մ' => 'մ',
455
+ 'Յ' => 'յ',
456
+ 'Ն' => 'ն',
457
+ 'Շ' => 'շ',
458
+ 'Ո' => 'ո',
459
+ 'Չ' => 'չ',
460
+ 'Պ' => 'պ',
461
+ 'Ջ' => 'ջ',
462
+ 'Ռ' => 'ռ',
463
+ 'Ս' => 'ս',
464
+ 'Վ' => 'վ',
465
+ 'Տ' => 'տ',
466
+ 'Ր' => 'ր',
467
+ 'Ց' => 'ց',
468
+ 'Ւ' => 'ւ',
469
+ 'Փ' => 'փ',
470
+ 'Ք' => 'ք',
471
+ 'Օ' => 'օ',
472
+ 'Ֆ' => 'ֆ',
473
+ 'Ⴀ' => 'ⴀ',
474
+ 'Ⴁ' => 'ⴁ',
475
+ 'Ⴂ' => 'ⴂ',
476
+ 'Ⴃ' => 'ⴃ',
477
+ 'Ⴄ' => 'ⴄ',
478
+ 'Ⴅ' => 'ⴅ',
479
+ 'Ⴆ' => 'ⴆ',
480
+ 'Ⴇ' => 'ⴇ',
481
+ 'Ⴈ' => 'ⴈ',
482
+ 'Ⴉ' => 'ⴉ',
483
+ 'Ⴊ' => 'ⴊ',
484
+ 'Ⴋ' => 'ⴋ',
485
+ 'Ⴌ' => 'ⴌ',
486
+ 'Ⴍ' => 'ⴍ',
487
+ 'Ⴎ' => 'ⴎ',
488
+ 'Ⴏ' => 'ⴏ',
489
+ 'Ⴐ' => 'ⴐ',
490
+ 'Ⴑ' => 'ⴑ',
491
+ 'Ⴒ' => 'ⴒ',
492
+ 'Ⴓ' => 'ⴓ',
493
+ 'Ⴔ' => 'ⴔ',
494
+ 'Ⴕ' => 'ⴕ',
495
+ 'Ⴖ' => 'ⴖ',
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
+ 'Ꮤ' => 'ꮤ',
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
+ 'Ḅ' => 'ḅ',
648
+ 'Ḇ' => 'ḇ',
649
+ 'Ḉ' => 'ḉ',
650
+ 'Ḋ' => 'ḋ',
651
+ 'Ḍ' => 'ḍ',
652
+ 'Ḏ' => 'ḏ',
653
+ 'Ḑ' => 'ḑ',
654
+ 'Ḓ' => 'ḓ',
655
+ 'Ḕ' => 'ḕ',
656
+ 'Ḗ' => 'ḗ',
657
+ 'Ḙ' => 'ḙ',
658
+ 'Ḛ' => 'ḛ',
659
+ 'Ḝ' => 'ḝ',
660
+ 'Ḟ' => 'ḟ',
661
+ 'Ḡ' => 'ḡ',
662
+ 'Ḣ' => 'ḣ',
663
+ 'Ḥ' => 'ḥ',
664
+ 'Ḧ' => 'ḧ',
665
+ 'Ḩ' => 'ḩ',
666
+ 'Ḫ' => 'ḫ',
667
+ 'Ḭ' => 'ḭ',
668
+ 'Ḯ' => 'ḯ',
669
+ 'Ḱ' => 'ḱ',
670
+ 'Ḳ' => 'ḳ',
671
+ 'Ḵ' => 'ḵ',
672
+ 'Ḷ' => 'ḷ',
673
+ 'Ḹ' => 'ḹ',
674
+ 'Ḻ' => 'ḻ',
675
+ 'Ḽ' => 'ḽ',
676
+ 'Ḿ' => 'ḿ',
677
+ 'Ṁ' => 'ṁ',
678
+ 'Ṃ' => 'ṃ',
679
+ 'Ṅ' => 'ṅ',
680
+ 'Ṇ' => 'ṇ',
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
+ 'Ạ' => 'ạ',
722
+ 'Ả' => 'ả',
723
+ 'Ấ' => 'ấ',
724
+ 'Ầ' => 'ầ',
725
+ 'Ẩ' => 'ẩ',
726
+ 'Ẫ' => 'ẫ',
727
+ 'Ậ' => 'ậ',
728
+ 'Ắ' => 'ắ',
729
+ 'Ằ' => 'ằ',
730
+ 'Ẳ' => 'ẳ',
731
+ 'Ẵ' => 'ẵ',
732
+ 'Ặ' => 'ặ',
733
+ 'Ẹ' => 'ẹ',
734
+ 'Ẻ' => 'ẻ',
735
+ 'Ẽ' => 'ẽ',
736
+ 'Ế' => 'ế',
737
+ 'Ề' => 'ề',
738
+ 'Ể' => 'ể',
739
+ 'Ễ' => 'ễ',
740
+ 'Ệ' => 'ệ',
741
+ 'Ỉ' => 'ỉ',
742
+ 'Ị' => 'ị',
743
+ 'Ọ' => 'ọ',
744
+ 'Ỏ' => 'ỏ',
745
+ 'Ố' => 'ố',
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
+ 'Ἣ' => 'ἣ',
787
+ 'Ἤ' => 'ἤ',
788
+ 'Ἥ' => 'ἥ',
789
+ 'Ἦ' => 'ἦ',
790
+ 'Ἧ' => 'ἧ',
791
+ 'Ἰ' => 'ἰ',
792
+ 'Ἱ' => 'ἱ',
793
+ 'Ἲ' => 'ἲ',
794
+ 'Ἳ' => 'ἳ',
795
+ 'Ἴ' => 'ἴ',
796
+ 'Ἵ' => 'ἵ',
797
+ 'Ἶ' => 'ἶ',
798
+ 'Ἷ' => 'ἷ',
799
+ 'Ὀ' => 'ὀ',
800
+ 'Ὁ' => 'ὁ',
801
+ 'Ὂ' => 'ὂ',
802
+ 'Ὃ' => 'ὃ',
803
+ 'Ὄ' => 'ὄ',
804
+ 'Ὅ' => 'ὅ',
805
+ 'Ὑ' => 'ὑ',
806
+ 'Ὓ' => 'ὓ',
807
+ 'Ὕ' => 'ὕ',
808
+ 'Ὗ' => 'ὗ',
809
+ 'Ὠ' => 'ὠ',
810
+ 'Ὡ' => 'ὡ',
811
+ 'Ὢ' => 'ὢ',
812
+ 'Ὣ' => 'ὣ',
813
+ 'Ὤ' => 'ὤ',
814
+ 'Ὥ' => 'ὥ',
815
+ 'Ὦ' => 'ὦ',
816
+ 'Ὧ' => 'ὧ',
817
+ 'ᾈ' => 'ᾀ',
818
+ 'ᾉ' => 'ᾁ',
819
+ 'ᾊ' => 'ᾂ',
820
+ 'ᾋ' => 'ᾃ',
821
+ 'ᾌ' => 'ᾄ',
822
+ 'ᾍ' => 'ᾅ',
823
+ 'ᾎ' => 'ᾆ',
824
+ 'ᾏ' => 'ᾇ',
825
+ 'ᾘ' => 'ᾐ',
826
+ 'ᾙ' => 'ᾑ',
827
+ 'ᾚ' => 'ᾒ',
828
+ 'ᾛ' => 'ᾓ',
829
+ 'ᾜ' => 'ᾔ',
830
+ 'ᾝ' => 'ᾕ',
831
+ 'ᾞ' => 'ᾖ',
832
+ 'ᾟ' => 'ᾗ',
833
+ 'ᾨ' => 'ᾠ',
834
+ 'ᾩ' => 'ᾡ',
835
+ 'ᾪ' => 'ᾢ',
836
+ 'ᾫ' => 'ᾣ',
837
+ 'ᾬ' => 'ᾤ',
838
+ 'ᾭ' => 'ᾥ',
839
+ 'ᾮ' => 'ᾦ',
840
+ 'ᾯ' => 'ᾧ',
841
+ 'Ᾰ' => 'ᾰ',
842
+ 'Ᾱ' => 'ᾱ',
843
+ 'Ὰ' => 'ὰ',
844
+ 'Ά' => 'ά',
845
+ 'ᾼ' => 'ᾳ',
846
+ 'Ὲ' => 'ὲ',
847
+ 'Έ' => 'έ',
848
+ 'Ὴ' => 'ὴ',
849
+ 'Ή' => 'ή',
850
+ 'ῌ' => 'ῃ',
851
+ 'Ῐ' => 'ῐ',
852
+ 'Ῑ' => 'ῑ',
853
+ 'Ὶ' => 'ὶ',
854
+ 'Ί' => 'ί',
855
+ 'Ῠ' => 'ῠ',
856
+ 'Ῡ' => 'ῡ',
857
+ 'Ὺ' => 'ὺ',
858
+ 'Ύ' => 'ύ',
859
+ 'Ῥ' => 'ῥ',
860
+ 'Ὸ' => 'ὸ',
861
+ 'Ό' => 'ό',
862
+ 'Ὼ' => 'ὼ',
863
+ 'Ώ' => 'ώ',
864
+ 'ῼ' => 'ῳ',
865
+ 'Ω' => 'ω',
866
+ 'K' => 'k',
867
+ 'Å' => 'å',
868
+ 'Ⅎ' => 'ⅎ',
869
+ 'Ⅰ' => 'ⅰ',
870
+ 'Ⅱ' => 'ⅱ',
871
+ 'Ⅲ' => 'ⅲ',
872
+ 'Ⅳ' => 'ⅳ',
873
+ 'Ⅴ' => 'ⅴ',
874
+ 'Ⅵ' => 'ⅵ',
875
+ 'Ⅶ' => 'ⅶ',
876
+ 'Ⅷ' => 'ⅷ',
877
+ 'Ⅸ' => 'ⅸ',
878
+ 'Ⅹ' => 'ⅹ',
879
+ 'Ⅺ' => 'ⅺ',
880
+ 'Ⅻ' => 'ⅻ',
881
+ 'Ⅼ' => 'ⅼ',
882
+ 'Ⅽ' => 'ⅽ',
883
+ 'Ⅾ' => 'ⅾ',
884
+ 'Ⅿ' => 'ⅿ',
885
+ 'Ↄ' => 'ↄ',
886
+ 'Ⓐ' => 'ⓐ',
887
+ 'Ⓑ' => 'ⓑ',
888
+ 'Ⓒ' => 'ⓒ',
889
+ 'Ⓓ' => 'ⓓ',
890
+ 'Ⓔ' => 'ⓔ',
891
+ 'Ⓕ' => 'ⓕ',
892
+ 'Ⓖ' => 'ⓖ',
893
+ 'Ⓗ' => 'ⓗ',
894
+ 'Ⓘ' => 'ⓘ',
895
+ 'Ⓙ' => 'ⓙ',
896
+ 'Ⓚ' => 'ⓚ',
897
+ 'Ⓛ' => 'ⓛ',
898
+ 'Ⓜ' => 'ⓜ',
899
+ 'Ⓝ' => 'ⓝ',
900
+ 'Ⓞ' => 'ⓞ',
901
+ 'Ⓟ' => 'ⓟ',
902
+ 'Ⓠ' => 'ⓠ',
903
+ 'Ⓡ' => 'ⓡ',
904
+ 'Ⓢ' => 'ⓢ',
905
+ 'Ⓣ' => 'ⓣ',
906
+ 'Ⓤ' => 'ⓤ',
907
+ 'Ⓥ' => 'ⓥ',
908
+ 'Ⓦ' => 'ⓦ',
909
+ 'Ⓧ' => 'ⓧ',
910
+ 'Ⓨ' => 'ⓨ',
911
+ 'Ⓩ' => 'ⓩ',
912
+ 'Ⰰ' => 'ⰰ',
913
+ 'Ⰱ' => 'ⰱ',
914
+ 'Ⰲ' => 'ⰲ',
915
+ 'Ⰳ' => 'ⰳ',
916
+ 'Ⰴ' => 'ⰴ',
917
+ 'Ⰵ' => 'ⰵ',
918
+ 'Ⰶ' => 'ⰶ',
919
+ 'Ⰷ' => 'ⰷ',
920
+ 'Ⰸ' => 'ⰸ',
921
+ 'Ⰹ' => 'ⰹ',
922
+ 'Ⰺ' => 'ⰺ',
923
+ 'Ⰻ' => 'ⰻ',
924
+ 'Ⰼ' => 'ⰼ',
925
+ 'Ⰽ' => 'ⰽ',
926
+ 'Ⰾ' => 'ⰾ',
927
+ 'Ⰿ' => 'ⰿ',
928
+ 'Ⱀ' => 'ⱀ',
929
+ 'Ⱁ' => 'ⱁ',
930
+ 'Ⱂ' => 'ⱂ',
931
+ 'Ⱃ' => 'ⱃ',
932
+ 'Ⱄ' => 'ⱄ',
933
+ 'Ⱅ' => 'ⱅ',
934
+ 'Ⱆ' => 'ⱆ',
935
+ 'Ⱇ' => 'ⱇ',
936
+ 'Ⱈ' => 'ⱈ',
937
+ 'Ⱉ' => 'ⱉ',
938
+ 'Ⱊ' => 'ⱊ',
939
+ 'Ⱋ' => 'ⱋ',
940
+ 'Ⱌ' => 'ⱌ',
941
+ 'Ⱍ' => 'ⱍ',
942
+ 'Ⱎ' => 'ⱎ',
943
+ 'Ⱏ' => 'ⱏ',
944
+ 'Ⱐ' => 'ⱐ',
945
+ 'Ⱑ' => 'ⱑ',
946
+ 'Ⱒ' => 'ⱒ',
947
+ 'Ⱓ' => 'ⱓ',
948
+ 'Ⱔ' => 'ⱔ',
949
+ 'Ⱕ' => 'ⱕ',
950
+ 'Ⱖ' => 'ⱖ',
951
+ 'Ⱗ' => 'ⱗ',
952
+ 'Ⱘ' => 'ⱘ',
953
+ 'Ⱙ' => 'ⱙ',
954
+ 'Ⱚ' => 'ⱚ',
955
+ 'Ⱛ' => 'ⱛ',
956
+ 'Ⱜ' => 'ⱜ',
957
+ 'Ⱝ' => 'ⱝ',
958
+ 'Ⱞ' => 'ⱞ',
959
+ 'Ⱡ' => 'ⱡ',
960
+ 'Ɫ' => 'ɫ',
961
+ 'Ᵽ' => 'ᵽ',
962
+ 'Ɽ' => 'ɽ',
963
+ 'Ⱨ' => 'ⱨ',
964
+ 'Ⱪ' => 'ⱪ',
965
+ 'Ⱬ' => 'ⱬ',
966
+ 'Ɑ' => 'ɑ',
967
+ 'Ɱ' => 'ɱ',
968
+ 'Ɐ' => 'ɐ',
969
+ 'Ɒ' => 'ɒ',
970
+ 'Ⱳ' => 'ⱳ',
971
+ 'Ⱶ' => 'ⱶ',
972
+ 'Ȿ' => 'ȿ',
973
+ 'Ɀ' => 'ɀ',
974
+ 'Ⲁ' => 'ⲁ',
975
+ 'Ⲃ' => 'ⲃ',
976
+ 'Ⲅ' => 'ⲅ',
977
+ 'Ⲇ' => 'ⲇ',
978
+ 'Ⲉ' => 'ⲉ',
979
+ 'Ⲋ' => 'ⲋ',
980
+ 'Ⲍ' => 'ⲍ',
981
+ 'Ⲏ' => 'ⲏ',
982
+ 'Ⲑ' => 'ⲑ',
983
+ 'Ⲓ' => 'ⲓ',
984
+ 'Ⲕ' => 'ⲕ',
985
+ 'Ⲗ' => 'ⲗ',
986
+ 'Ⲙ' => 'ⲙ',
987
+ 'Ⲛ' => 'ⲛ',
988
+ 'Ⲝ' => 'ⲝ',
989
+ 'Ⲟ' => 'ⲟ',
990
+ 'Ⲡ' => 'ⲡ',
991
+ 'Ⲣ' => 'ⲣ',
992
+ 'Ⲥ' => 'ⲥ',
993
+ 'Ⲧ' => 'ⲧ',
994
+ 'Ⲩ' => 'ⲩ',
995
+ 'Ⲫ' => 'ⲫ',
996
+ 'Ⲭ' => 'ⲭ',
997
+ 'Ⲯ' => 'ⲯ',
998
+ 'Ⲱ' => 'ⲱ',
999
+ 'Ⲳ' => 'ⲳ',
1000
+ 'Ⲵ' => 'ⲵ',
1001
+ 'Ⲷ' => 'ⲷ',
1002
+ 'Ⲹ' => 'ⲹ',
1003
+ 'Ⲻ' => 'ⲻ',
1004
+ 'Ⲽ' => 'ⲽ',
1005
+ 'Ⲿ' => 'ⲿ',
1006
+ 'Ⳁ' => 'ⳁ',
1007
+ 'Ⳃ' => 'ⳃ',
1008
+ 'Ⳅ' => 'ⳅ',
1009
+ 'Ⳇ' => 'ⳇ',
1010
+ 'Ⳉ' => 'ⳉ',
1011
+ 'Ⳋ' => 'ⳋ',
1012
+ 'Ⳍ' => 'ⳍ',
1013
+ 'Ⳏ' => 'ⳏ',
1014
+ 'Ⳑ' => 'ⳑ',
1015
+ 'Ⳓ' => 'ⳓ',
1016
+ 'Ⳕ' => 'ⳕ',
1017
+ 'Ⳗ' => 'ⳗ',
1018
+ 'Ⳙ' => 'ⳙ',
1019
+ 'Ⳛ' => 'ⳛ',
1020
+ 'Ⳝ' => 'ⳝ',
1021
+ 'Ⳟ' => 'ⳟ',
1022
+ 'Ⳡ' => 'ⳡ',
1023
+ 'Ⳣ' => 'ⳣ',
1024
+ 'Ⳬ' => 'ⳬ',
1025
+ 'Ⳮ' => 'ⳮ',
1026
+ 'Ⳳ' => 'ⳳ',
1027
+ 'Ꙁ' => 'ꙁ',
1028
+ 'Ꙃ' => 'ꙃ',
1029
+ 'Ꙅ' => 'ꙅ',
1030
+ 'Ꙇ' => 'ꙇ',
1031
+ 'Ꙉ' => 'ꙉ',
1032
+ 'Ꙋ' => 'ꙋ',
1033
+ 'Ꙍ' => 'ꙍ',
1034
+ 'Ꙏ' => 'ꙏ',
1035
+ 'Ꙑ' => 'ꙑ',
1036
+ 'Ꙓ' => 'ꙓ',
1037
+ 'Ꙕ' => 'ꙕ',
1038
+ 'Ꙗ' => 'ꙗ',
1039
+ 'Ꙙ' => 'ꙙ',
1040
+ 'Ꙛ' => 'ꙛ',
1041
+ 'Ꙝ' => 'ꙝ',
1042
+ 'Ꙟ' => 'ꙟ',
1043
+ 'Ꙡ' => 'ꙡ',
1044
+ 'Ꙣ' => 'ꙣ',
1045
+ 'Ꙥ' => 'ꙥ',
1046
+ 'Ꙧ' => 'ꙧ',
1047
+ 'Ꙩ' => 'ꙩ',
1048
+ 'Ꙫ' => 'ꙫ',
1049
+ 'Ꙭ' => 'ꙭ',
1050
+ 'Ꚁ' => 'ꚁ',
1051
+ 'Ꚃ' => 'ꚃ',
1052
+ 'Ꚅ' => 'ꚅ',
1053
+ 'Ꚇ' => 'ꚇ',
1054
+ 'Ꚉ' => 'ꚉ',
1055
+ 'Ꚋ' => 'ꚋ',
1056
+ 'Ꚍ' => 'ꚍ',
1057
+ 'Ꚏ' => 'ꚏ',
1058
+ 'Ꚑ' => 'ꚑ',
1059
+ 'Ꚓ' => 'ꚓ',
1060
+ 'Ꚕ' => 'ꚕ',
1061
+ 'Ꚗ' => 'ꚗ',
1062
+ 'Ꚙ' => 'ꚙ',
1063
+ 'Ꚛ' => 'ꚛ',
1064
+ 'Ꜣ' => 'ꜣ',
1065
+ 'Ꜥ' => 'ꜥ',
1066
+ 'Ꜧ' => 'ꜧ',
1067
+ 'Ꜩ' => 'ꜩ',
1068
+ 'Ꜫ' => 'ꜫ',
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
+ 'A' => 'a',
1147
+ 'B' => 'b',
1148
+ 'C' => 'c',
1149
+ 'D' => 'd',
1150
+ 'E' => 'e',
1151
+ 'F' => 'f',
1152
+ 'G' => 'g',
1153
+ 'H' => 'h',
1154
+ 'I' => 'i',
1155
+ 'J' => 'j',
1156
+ 'K' => 'k',
1157
+ 'L' => 'l',
1158
+ 'M' => 'm',
1159
+ 'N' => 'n',
1160
+ 'O' => 'o',
1161
+ 'P' => 'p',
1162
+ 'Q' => 'q',
1163
+ 'R' => 'r',
1164
+ 'S' => 's',
1165
+ 'T' => 't',
1166
+ 'U' => 'u',
1167
+ 'V' => 'v',
1168
+ 'W' => 'w',
1169
+ 'X' => 'x',
1170
+ 'Y' => 'y',
1171
+ 'Z' => 'z',
1172
+ '𐐀' => '𐐨',
1173
+ '𐐁' => '𐐩',
1174
+ '𐐂' => '𐐪',
1175
+ '𐐃' => '𐐫',
1176
+ '𐐄' => '𐐬',
1177
+ '𐐅' => '𐐭',
1178
+ '𐐆' => '𐐮',
1179
+ '𐐇' => '𐐯',
1180
+ '𐐈' => '𐐰',
1181
+ '𐐉' => '𐐱',
1182
+ '𐐊' => '𐐲',
1183
+ '𐐋' => '𐐳',
1184
+ '𐐌' => '𐐴',
1185
+ '𐐍' => '𐐵',
1186
+ '𐐎' => '𐐶',
1187
+ '𐐏' => '𐐷',
1188
+ '𐐐' => '𐐸',
1189
+ '𐐑' => '𐐹',
1190
+ '𐐒' => '𐐺',
1191
+ '𐐓' => '𐐻',
1192
+ '𐐔' => '𐐼',
1193
+ '𐐕' => '𐐽',
1194
+ '𐐖' => '𐐾',
1195
+ '𐐗' => '𐐿',
1196
+ '𐐘' => '𐑀',
1197
+ '𐐙' => '𐑁',
1198
+ '𐐚' => '𐑂',
1199
+ '𐐛' => '𐑃',
1200
+ '𐐜' => '𐑄',
1201
+ '𐐝' => '𐑅',
1202
+ '𐐞' => '𐑆',
1203
+ '𐐟' => '𐑇',
1204
+ '𐐠' => '𐑈',
1205
+ '𐐡' => '𐑉',
1206
+ '𐐢' => '𐑊',
1207
+ '𐐣' => '𐑋',
1208
+ '𐐤' => '𐑌',
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
+ '𑢢' => '𑣂',
1302
+ '𑢣' => '𑣃',
1303
+ '𑢤' => '𑣄',
1304
+ '𑢥' => '𑣅',
1305
+ '𑢦' => '𑣆',
1306
+ '𑢧' => '𑣇',
1307
+ '𑢨' => '𑣈',
1308
+ '𑢩' => '𑣉',
1309
+ '𑢪' => '𑣊',
1310
+ '𑢫' => '𑣋',
1311
+ '𑢬' => '𑣌',
1312
+ '𑢭' => '𑣍',
1313
+ '𑢮' => '𑣎',
1314
+ '𑢯' => '𑣏',
1315
+ '𑢰' => '𑣐',
1316
+ '𑢱' => '𑣑',
1317
+ '𑢲' => '𑣒',
1318
+ '𑢳' => '𑣓',
1319
+ '𑢴' => '𑣔',
1320
+ '𑢵' => '𑣕',
1321
+ '𑢶' => '𑣖',
1322
+ '𑢷' => '𑣗',
1323
+ '𑢸' => '𑣘',
1324
+ '𑢹' => '𑣙',
1325
+ '𑢺' => '𑣚',
1326
+ '𑢻' => '𑣛',
1327
+ '𑢼' => '𑣜',
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/titleCaseRegexp.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
+
5
+ return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php ADDED
@@ -0,0 +1,1414 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'a' => 'A',
5
+ 'b' => 'B',
6
+ 'c' => 'C',
7
+ 'd' => 'D',
8
+ 'e' => 'E',
9
+ 'f' => 'F',
10
+ 'g' => 'G',
11
+ 'h' => 'H',
12
+ 'i' => 'I',
13
+ 'j' => 'J',
14
+ 'k' => 'K',
15
+ 'l' => 'L',
16
+ 'm' => 'M',
17
+ 'n' => 'N',
18
+ 'o' => 'O',
19
+ 'p' => 'P',
20
+ 'q' => 'Q',
21
+ 'r' => 'R',
22
+ 's' => 'S',
23
+ 't' => 'T',
24
+ 'u' => 'U',
25
+ 'v' => 'V',
26
+ 'w' => 'W',
27
+ 'x' => 'X',
28
+ 'y' => 'Y',
29
+ 'z' => 'Z',
30
+ 'µ' => 'Μ',
31
+ 'à' => 'À',
32
+ 'á' => 'Á',
33
+ 'â' => 'Â',
34
+ 'ã' => 'Ã',
35
+ 'ä' => 'Ä',
36
+ 'å' => 'Å',
37
+ 'æ' => 'Æ',
38
+ 'ç' => 'Ç',
39
+ 'è' => 'È',
40
+ 'é' => 'É',
41
+ 'ê' => 'Ê',
42
+ 'ë' => 'Ë',
43
+ 'ì' => 'Ì',
44
+ 'í' => 'Í',
45
+ 'î' => 'Î',
46
+ 'ï' => 'Ï',
47
+ 'ð' => 'Ð',
48
+ 'ñ' => 'Ñ',
49
+ 'ò' => 'Ò',
50
+ 'ó' => 'Ó',
51
+ 'ô' => 'Ô',
52
+ 'õ' => 'Õ',
53
+ 'ö' => 'Ö',
54
+ 'ø' => 'Ø',
55
+ 'ù' => 'Ù',
56
+ 'ú' => 'Ú',
57
+ 'û' => 'Û',
58
+ 'ü' => 'Ü',
59
+ 'ý' => 'Ý',
60
+ 'þ' => 'Þ',
61
+ 'ÿ' => 'Ÿ',
62
+ 'ā' => 'Ā',
63
+ 'ă' => 'Ă',
64
+ 'ą' => 'Ą',
65
+ 'ć' => 'Ć',
66
+ 'ĉ' => 'Ĉ',
67
+ 'ċ' => 'Ċ',
68
+ 'č' => 'Č',
69
+ 'ď' => 'Ď',
70
+ 'đ' => 'Đ',
71
+ 'ē' => 'Ē',
72
+ 'ĕ' => 'Ĕ',
73
+ 'ė' => 'Ė',
74
+ 'ę' => 'Ę',
75
+ 'ě' => 'Ě',
76
+ 'ĝ' => 'Ĝ',
77
+ 'ğ' => 'Ğ',
78
+ 'ġ' => 'Ġ',
79
+ 'ģ' => 'Ģ',
80
+ 'ĥ' => 'Ĥ',
81
+ 'ħ' => 'Ħ',
82
+ 'ĩ' => 'Ĩ',
83
+ 'ī' => 'Ī',
84
+ 'ĭ' => 'Ĭ',
85
+ 'į' => 'Į',
86
+ 'ı' => 'I',
87
+ 'ij' => 'IJ',
88
+ 'ĵ' => 'Ĵ',
89
+ 'ķ' => 'Ķ',
90
+ 'ĺ' => 'Ĺ',
91
+ 'ļ' => 'Ļ',
92
+ 'ľ' => 'Ľ',
93
+ 'ŀ' => 'Ŀ',
94
+ 'ł' => 'Ł',
95
+ 'ń' => 'Ń',
96
+ 'ņ' => 'Ņ',
97
+ 'ň' => 'Ň',
98
+ 'ŋ' => 'Ŋ',
99
+ 'ō' => 'Ō',
100
+ 'ŏ' => 'Ŏ',
101
+ 'ő' => 'Ő',
102
+ 'œ' => 'Œ',
103
+ 'ŕ' => 'Ŕ',
104
+ 'ŗ' => 'Ŗ',
105
+ 'ř' => 'Ř',
106
+ 'ś' => 'Ś',
107
+ 'ŝ' => 'Ŝ',
108
+ 'ş' => 'Ş',
109
+ 'š' => 'Š',
110
+ 'ţ' => 'Ţ',
111
+ 'ť' => 'Ť',
112
+ 'ŧ' => 'Ŧ',
113
+ 'ũ' => 'Ũ',
114
+ 'ū' => 'Ū',
115
+ 'ŭ' => 'Ŭ',
116
+ 'ů' => 'Ů',
117
+ 'ű' => 'Ű',
118
+ 'ų' => 'Ų',
119
+ 'ŵ' => 'Ŵ',
120
+ 'ŷ' => 'Ŷ',
121
+ 'ź' => 'Ź',
122
+ 'ż' => 'Ż',
123
+ 'ž' => 'Ž',
124
+ 'ſ' => 'S',
125
+ 'ƀ' => 'Ƀ',
126
+ 'ƃ' => 'Ƃ',
127
+ 'ƅ' => 'Ƅ',
128
+ 'ƈ' => 'Ƈ',
129
+ 'ƌ' => 'Ƌ',
130
+ 'ƒ' => 'Ƒ',
131
+ 'ƕ' => 'Ƕ',
132
+ 'ƙ' => 'Ƙ',
133
+ 'ƚ' => 'Ƚ',
134
+ 'ƞ' => 'Ƞ',
135
+ 'ơ' => 'Ơ',
136
+ 'ƣ' => 'Ƣ',
137
+ 'ƥ' => 'Ƥ',
138
+ 'ƨ' => 'Ƨ',
139
+ 'ƭ' => 'Ƭ',
140
+ 'ư' => 'Ư',
141
+ 'ƴ' => 'Ƴ',
142
+ 'ƶ' => 'Ƶ',
143
+ 'ƹ' => 'Ƹ',
144
+ 'ƽ' => 'Ƽ',
145
+ 'ƿ' => 'Ƿ',
146
+ 'Dž' => 'DŽ',
147
+ 'dž' => 'DŽ',
148
+ 'Lj' => 'LJ',
149
+ 'lj' => 'LJ',
150
+ 'Nj' => 'NJ',
151
+ 'nj' => 'NJ',
152
+ 'ǎ' => 'Ǎ',
153
+ 'ǐ' => 'Ǐ',
154
+ 'ǒ' => 'Ǒ',
155
+ 'ǔ' => 'Ǔ',
156
+ 'ǖ' => 'Ǖ',
157
+ 'ǘ' => 'Ǘ',
158
+ 'ǚ' => 'Ǚ',
159
+ 'ǜ' => 'Ǜ',
160
+ 'ǝ' => 'Ǝ',
161
+ 'ǟ' => 'Ǟ',
162
+ 'ǡ' => 'Ǡ',
163
+ 'ǣ' => 'Ǣ',
164
+ 'ǥ' => 'Ǥ',
165
+ 'ǧ' => 'Ǧ',
166
+ 'ǩ' => 'Ǩ',
167
+ 'ǫ' => 'Ǫ',
168
+ 'ǭ' => 'Ǭ',
169
+ 'ǯ' => 'Ǯ',
170
+ 'Dz' => 'DZ',
171
+ 'dz' => 'DZ',
172
+ 'ǵ' => 'Ǵ',
173
+ 'ǹ' => 'Ǹ',
174
+ 'ǻ' => 'Ǻ',
175
+ 'ǽ' => 'Ǽ',
176
+ 'ǿ' => 'Ǿ',
177
+ 'ȁ' => 'Ȁ',
178
+ 'ȃ' => 'Ȃ',
179
+ 'ȅ' => 'Ȅ',
180
+ 'ȇ' => 'Ȇ',
181
+ 'ȉ' => 'Ȉ',
182
+ 'ȋ' => 'Ȋ',
183
+ 'ȍ' => 'Ȍ',
184
+ 'ȏ' => 'Ȏ',
185
+ 'ȑ' => 'Ȑ',
186
+ 'ȓ' => 'Ȓ',
187
+ 'ȕ' => 'Ȕ',
188
+ 'ȗ' => 'Ȗ',
189
+ 'ș' => 'Ș',
190
+ 'ț' => 'Ț',
191
+ 'ȝ' => 'Ȝ',
192
+ 'ȟ' => 'Ȟ',
193
+ 'ȣ' => 'Ȣ',
194
+ 'ȥ' => 'Ȥ',
195
+ 'ȧ' => 'Ȧ',
196
+ 'ȩ' => 'Ȩ',
197
+ 'ȫ' => 'Ȫ',
198
+ 'ȭ' => 'Ȭ',
199
+ 'ȯ' => 'Ȯ',
200
+ 'ȱ' => 'Ȱ',
201
+ 'ȳ' => 'Ȳ',
202
+ 'ȼ' => 'Ȼ',
203
+ 'ȿ' => 'Ȿ',
204
+ 'ɀ' => 'Ɀ',
205
+ 'ɂ' => 'Ɂ',
206
+ 'ɇ' => 'Ɇ',
207
+ 'ɉ' => 'Ɉ',
208
+ 'ɋ' => 'Ɋ',
209
+ 'ɍ' => 'Ɍ',
210
+ 'ɏ' => 'Ɏ',
211
+ 'ɐ' => 'Ɐ',
212
+ 'ɑ' => 'Ɑ',
213
+ 'ɒ' => 'Ɒ',
214
+ 'ɓ' => 'Ɓ',
215
+ 'ɔ' => 'Ɔ',
216
+ 'ɖ' => 'Ɖ',
217
+ 'ɗ' => 'Ɗ',
218
+ 'ə' => 'Ə',
219
+ 'ɛ' => 'Ɛ',
220
+ 'ɜ' => 'Ɜ',
221
+ 'ɠ' => 'Ɠ',
222
+ 'ɡ' => 'Ɡ',
223
+ 'ɣ' => 'Ɣ',
224
+ 'ɥ' => 'Ɥ',
225
+ 'ɦ' => 'Ɦ',
226
+ 'ɨ' => 'Ɨ',
227
+ 'ɩ' => 'Ɩ',
228
+ 'ɪ' => 'Ɪ',
229
+ 'ɫ' => 'Ɫ',
230
+ 'ɬ' => 'Ɬ',
231
+ 'ɯ' => 'Ɯ',
232
+ 'ɱ' => 'Ɱ',
233
+ 'ɲ' => 'Ɲ',
234
+ 'ɵ' => 'Ɵ',
235
+ 'ɽ' => 'Ɽ',
236
+ 'ʀ' => 'Ʀ',
237
+ 'ʂ' => 'Ʂ',
238
+ 'ʃ' => 'Ʃ',
239
+ 'ʇ' => 'Ʇ',
240
+ 'ʈ' => 'Ʈ',
241
+ 'ʉ' => 'Ʉ',
242
+ 'ʊ' => 'Ʊ',
243
+ 'ʋ' => 'Ʋ',
244
+ 'ʌ' => 'Ʌ',
245
+ 'ʒ' => 'Ʒ',
246
+ 'ʝ' => 'Ʝ',
247
+ 'ʞ' => 'Ʞ',
248
+ 'ͅ' => 'Ι',
249
+ 'ͱ' => 'Ͱ',
250
+ 'ͳ' => 'Ͳ',
251
+ 'ͷ' => 'Ͷ',
252
+ 'ͻ' => 'Ͻ',
253
+ 'ͼ' => 'Ͼ',
254
+ 'ͽ' => 'Ͽ',
255
+ 'ά' => 'Ά',
256
+ 'έ' => 'Έ',
257
+ 'ή' => 'Ή',
258
+ 'ί' => 'Ί',
259
+ 'α' => 'Α',
260
+ 'β' => 'Β',
261
+ 'γ' => 'Γ',
262
+ 'δ' => 'Δ',
263
+ 'ε' => 'Ε',
264
+ 'ζ' => 'Ζ',
265
+ 'η' => 'Η',
266
+ 'θ' => 'Θ',
267
+ 'ι' => 'Ι',
268
+ 'κ' => 'Κ',
269
+ 'λ' => 'Λ',
270
+ 'μ' => 'Μ',
271
+ 'ν' => 'Ν',
272
+ 'ξ' => 'Ξ',
273
+ 'ο' => 'Ο',
274
+ 'π' => 'Π',
275
+ 'ρ' => 'Ρ',
276
+ 'ς' => 'Σ',
277
+ 'σ' => 'Σ',
278
+ 'τ' => 'Τ',
279
+ 'υ' => 'Υ',
280
+ 'φ' => 'Φ',
281
+ 'χ' => 'Χ',
282
+ 'ψ' => 'Ψ',
283
+ 'ω' => 'Ω',
284
+ 'ϊ' => 'Ϊ',
285
+ 'ϋ' => 'Ϋ',
286
+ 'ό' => 'Ό',
287
+ 'ύ' => 'Ύ',
288
+ 'ώ' => 'Ώ',
289
+ 'ϐ' => 'Β',
290
+ 'ϑ' => 'Θ',
291
+ 'ϕ' => 'Φ',
292
+ 'ϖ' => 'Π',
293
+ 'ϗ' => 'Ϗ',
294
+ 'ϙ' => 'Ϙ',
295
+ 'ϛ' => 'Ϛ',
296
+ 'ϝ' => 'Ϝ',
297
+ 'ϟ' => 'Ϟ',
298
+ 'ϡ' => 'Ϡ',
299
+ 'ϣ' => 'Ϣ',
300
+ 'ϥ' => 'Ϥ',
301
+ 'ϧ' => 'Ϧ',
302
+ 'ϩ' => 'Ϩ',
303
+ 'ϫ' => 'Ϫ',
304
+ 'ϭ' => 'Ϭ',
305
+ 'ϯ' => 'Ϯ',
306
+ 'ϰ' => 'Κ',
307
+ 'ϱ' => 'Ρ',
308
+ 'ϲ' => 'Ϲ',
309
+ 'ϳ' => 'Ϳ',
310
+ 'ϵ' => 'Ε',
311
+ 'ϸ' => 'Ϸ',
312
+ 'ϻ' => 'Ϻ',
313
+ 'а' => 'А',
314
+ 'б' => 'Б',
315
+ 'в' => 'В',
316
+ 'г' => 'Г',
317
+ 'д' => 'Д',
318
+ 'е' => 'Е',
319
+ 'ж' => 'Ж'