Completed
Push — 14.2 ( e07840...cec2da )
by Ralf
83:18 queued 52:04
created
phpgwapi/inc/idna_convert/idna_convert.class.php 1 patch
Indentation   +1509 added lines, -1509 removed lines patch added patch discarded remove patch
@@ -52,1554 +52,1554 @@
 block discarded – undo
52 52
  */
53 53
 class idna_convert
54 54
 {
55
-    // NP See below
55
+	// NP See below
56 56
 
57
-    // Internal settings, do not mess with them
58
-    protected $_punycode_prefix = 'xn--';
59
-    protected $_invalid_ucs = 0x80000000;
60
-    protected $_max_ucs = 0x10FFFF;
61
-    protected $_base = 36;
62
-    protected $_tmin = 1;
63
-    protected $_tmax = 26;
64
-    protected $_skew = 38;
65
-    protected $_damp = 700;
66
-    protected $_initial_bias = 72;
67
-    protected $_initial_n = 0x80;
68
-    protected $_sbase = 0xAC00;
69
-    protected $_lbase = 0x1100;
70
-    protected $_vbase = 0x1161;
71
-    protected $_tbase = 0x11A7;
72
-    protected $_lcount = 19;
73
-    protected $_vcount = 21;
74
-    protected $_tcount = 28;
75
-    protected $_ncount = 588;   // _vcount * _tcount
76
-    protected $_scount = 11172; // _lcount * _tcount * _vcount
77
-    protected $_error = false;
57
+	// Internal settings, do not mess with them
58
+	protected $_punycode_prefix = 'xn--';
59
+	protected $_invalid_ucs = 0x80000000;
60
+	protected $_max_ucs = 0x10FFFF;
61
+	protected $_base = 36;
62
+	protected $_tmin = 1;
63
+	protected $_tmax = 26;
64
+	protected $_skew = 38;
65
+	protected $_damp = 700;
66
+	protected $_initial_bias = 72;
67
+	protected $_initial_n = 0x80;
68
+	protected $_sbase = 0xAC00;
69
+	protected $_lbase = 0x1100;
70
+	protected $_vbase = 0x1161;
71
+	protected $_tbase = 0x11A7;
72
+	protected $_lcount = 19;
73
+	protected $_vcount = 21;
74
+	protected $_tcount = 28;
75
+	protected $_ncount = 588;   // _vcount * _tcount
76
+	protected $_scount = 11172; // _lcount * _tcount * _vcount
77
+	protected $_error = false;
78 78
 
79
-    protected static $_mb_string_overload = null;
79
+	protected static $_mb_string_overload = null;
80 80
 
81
-    // See {@link set_paramter()} for details of how to change the following
82
-    // settings from within your script / application
83
-    protected $_api_encoding = 'utf8';   // Default input charset is UTF-8
84
-    protected $_allow_overlong = false;  // Overlong UTF-8 encodings are forbidden
85
-    protected $_strict_mode = false;     // Behave strict or not
86
-    protected $_idn_version = 2003;      // Can be either 2003 (old, default) or 2008
81
+	// See {@link set_paramter()} for details of how to change the following
82
+	// settings from within your script / application
83
+	protected $_api_encoding = 'utf8';   // Default input charset is UTF-8
84
+	protected $_allow_overlong = false;  // Overlong UTF-8 encodings are forbidden
85
+	protected $_strict_mode = false;     // Behave strict or not
86
+	protected $_idn_version = 2003;      // Can be either 2003 (old, default) or 2008
87 87
 
88
-    /**
89
-     * the constructor
90
-     *
91
-     * @param array $options
92
-     * @return boolean
93
-     * @since 0.5.2
94
-     */
95
-    public function __construct($options = false)
96
-    {
97
-        $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
98
-        // If parameters are given, pass these to the respective method
99
-        if (is_array($options)) {
100
-            $this->set_parameter($options);
101
-        }
88
+	/**
89
+	 * the constructor
90
+	 *
91
+	 * @param array $options
92
+	 * @return boolean
93
+	 * @since 0.5.2
94
+	 */
95
+	public function __construct($options = false)
96
+	{
97
+		$this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
98
+		// If parameters are given, pass these to the respective method
99
+		if (is_array($options)) {
100
+			$this->set_parameter($options);
101
+		}
102 102
 
103
-        // populate mbstring overloading cache if not set
104
-        if (self::$_mb_string_overload === null) {
105
-            self::$_mb_string_overload = (extension_loaded('mbstring')
106
-                && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
107
-        }
108
-    }
103
+		// populate mbstring overloading cache if not set
104
+		if (self::$_mb_string_overload === null) {
105
+			self::$_mb_string_overload = (extension_loaded('mbstring')
106
+				&& (ini_get('mbstring.func_overload') & 0x02) === 0x02);
107
+		}
108
+	}
109 109
 
110
-    /**
111
-     * Sets a new option value. Available options and values:
112
-     * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
113
-     *         'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
114
-     * [overlong - Unicode does not allow unnecessarily long encodings of chars,
115
-     *             to allow this, set this parameter to true, else to false;
116
-     *             default is false.]
117
-     * [strict - true: strict mode, good for registration purposes - Causes errors
118
-     *           on failures; false: loose mode, ideal for "wildlife" applications
119
-     *           by silently ignoring errors and returning the original input instead
120
-     *
121
-     * @param    mixed     Parameter to set (string: single parameter; array of Parameter => Value pairs)
122
-     * @param    string    Value to use (if parameter 1 is a string)
123
-     * @return   boolean   true on success, false otherwise
124
-     */
125
-    public function set_parameter($option, $value = false)
126
-    {
127
-        if (!is_array($option)) {
128
-            $option = array($option => $value);
129
-        }
130
-        foreach ($option as $k => $v) {
131
-            switch ($k) {
132
-            case 'encoding':
133
-                switch ($v) {
134
-                case 'utf8':
135
-                case 'ucs4_string':
136
-                case 'ucs4_array':
137
-                    $this->_api_encoding = $v;
138
-                    break;
139
-                default:
140
-                    $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
141
-                    return false;
142
-                }
143
-                break;
144
-            case 'overlong':
145
-                $this->_allow_overlong = ($v) ? true : false;
146
-                break;
147
-            case 'strict':
148
-                $this->_strict_mode = ($v) ? true : false;
149
-                break;
150
-            case 'idn_version':
151
-                if (in_array($v, array('2003', '2008'))) {
152
-                    $this->_idn_version = $v;
153
-                } else {
154
-                    $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
155
-                }
156
-                break;
157
-            case 'encode_german_sz': // Deprecated
158
-                if (!$v) {
159
-                    self::$NP['replacemaps'][0xDF] = array(0x73, 0x73);
160
-                } else {
161
-                    unset(self::$NP['replacemaps'][0xDF]);
162
-                }
163
-                break;
164
-            default:
165
-                $this->_error('Set Parameter: Unknown option '.$k);
166
-                return false;
167
-            }
168
-        }
169
-        return true;
170
-    }
110
+	/**
111
+	 * Sets a new option value. Available options and values:
112
+	 * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
113
+	 *         'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
114
+	 * [overlong - Unicode does not allow unnecessarily long encodings of chars,
115
+	 *             to allow this, set this parameter to true, else to false;
116
+	 *             default is false.]
117
+	 * [strict - true: strict mode, good for registration purposes - Causes errors
118
+	 *           on failures; false: loose mode, ideal for "wildlife" applications
119
+	 *           by silently ignoring errors and returning the original input instead
120
+	 *
121
+	 * @param    mixed     Parameter to set (string: single parameter; array of Parameter => Value pairs)
122
+	 * @param    string    Value to use (if parameter 1 is a string)
123
+	 * @return   boolean   true on success, false otherwise
124
+	 */
125
+	public function set_parameter($option, $value = false)
126
+	{
127
+		if (!is_array($option)) {
128
+			$option = array($option => $value);
129
+		}
130
+		foreach ($option as $k => $v) {
131
+			switch ($k) {
132
+			case 'encoding':
133
+				switch ($v) {
134
+				case 'utf8':
135
+				case 'ucs4_string':
136
+				case 'ucs4_array':
137
+					$this->_api_encoding = $v;
138
+					break;
139
+				default:
140
+					$this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
141
+					return false;
142
+				}
143
+				break;
144
+			case 'overlong':
145
+				$this->_allow_overlong = ($v) ? true : false;
146
+				break;
147
+			case 'strict':
148
+				$this->_strict_mode = ($v) ? true : false;
149
+				break;
150
+			case 'idn_version':
151
+				if (in_array($v, array('2003', '2008'))) {
152
+					$this->_idn_version = $v;
153
+				} else {
154
+					$this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k);
155
+				}
156
+				break;
157
+			case 'encode_german_sz': // Deprecated
158
+				if (!$v) {
159
+					self::$NP['replacemaps'][0xDF] = array(0x73, 0x73);
160
+				} else {
161
+					unset(self::$NP['replacemaps'][0xDF]);
162
+				}
163
+				break;
164
+			default:
165
+				$this->_error('Set Parameter: Unknown option '.$k);
166
+				return false;
167
+			}
168
+		}
169
+		return true;
170
+	}
171 171
 
172
-    /**
173
-     * Decode a given ACE domain name
174
-     * @param    string   Domain name (ACE string)
175
-     * [@param    string   Desired output encoding, see {@link set_parameter}]
176
-     * @return   string   Decoded Domain name (UTF-8 or UCS-4)
177
-     */
178
-    public function decode($input, $one_time_encoding = false)
179
-    {
180
-        // Optionally set
181
-        if ($one_time_encoding) {
182
-            switch ($one_time_encoding) {
183
-            case 'utf8':
184
-            case 'ucs4_string':
185
-            case 'ucs4_array':
186
-                break;
187
-            default:
188
-                $this->_error('Unknown encoding '.$one_time_encoding);
189
-                return false;
190
-            }
191
-        }
192
-        // Make sure to drop any newline characters around
193
-        $input = trim($input);
172
+	/**
173
+	 * Decode a given ACE domain name
174
+	 * @param    string   Domain name (ACE string)
175
+	 * [@param    string   Desired output encoding, see {@link set_parameter}]
176
+	 * @return   string   Decoded Domain name (UTF-8 or UCS-4)
177
+	 */
178
+	public function decode($input, $one_time_encoding = false)
179
+	{
180
+		// Optionally set
181
+		if ($one_time_encoding) {
182
+			switch ($one_time_encoding) {
183
+			case 'utf8':
184
+			case 'ucs4_string':
185
+			case 'ucs4_array':
186
+				break;
187
+			default:
188
+				$this->_error('Unknown encoding '.$one_time_encoding);
189
+				return false;
190
+			}
191
+		}
192
+		// Make sure to drop any newline characters around
193
+		$input = trim($input);
194 194
 
195
-        // Negotiate input and try to determine, whether it is a plain string,
196
-        // an email address or something like a complete URL
197
-        if (strpos($input, '@')) { // Maybe it is an email address
198
-            // No no in strict mode
199
-            if ($this->_strict_mode) {
200
-                $this->_error('Only simple domain name parts can be handled in strict mode');
201
-                return false;
202
-            }
203
-            list ($email_pref, $input) = explode('@', $input, 2);
204
-            $arr = explode('.', $input);
205
-            foreach ($arr as $k => $v) {
206
-                if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
207
-                    $conv = $this->_decode($v);
208
-                    if ($conv) $arr[$k] = $conv;
209
-                }
210
-            }
211
-            $input = join('.', $arr);
212
-            $arr = explode('.', $email_pref);
213
-            foreach ($arr as $k => $v) {
214
-                if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
215
-                    $conv = $this->_decode($v);
216
-                    if ($conv) $arr[$k] = $conv;
217
-                }
218
-            }
219
-            $email_pref = join('.', $arr);
220
-            $return = $email_pref . '@' . $input;
221
-        } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
222
-            // No no in strict mode
223
-            if ($this->_strict_mode) {
224
-                $this->_error('Only simple domain name parts can be handled in strict mode');
225
-                return false;
226
-            }
227
-            $parsed = parse_url($input);
228
-            if (isset($parsed['host'])) {
229
-                $arr = explode('.', $parsed['host']);
230
-                foreach ($arr as $k => $v) {
231
-                    $conv = $this->_decode($v);
232
-                    if ($conv) $arr[$k] = $conv;
233
-                }
234
-                $parsed['host'] = join('.', $arr);
235
-                $return =
236
-                        (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
237
-                        .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
238
-                        .$parsed['host']
239
-                        .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
240
-                        .(empty($parsed['path']) ? '' : $parsed['path'])
241
-                        .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
242
-                        .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
243
-            } else { // parse_url seems to have failed, try without it
244
-                $arr = explode('.', $input);
245
-                foreach ($arr as $k => $v) {
246
-                    $conv = $this->_decode($v);
247
-                    $arr[$k] = ($conv) ? $conv : $v;
248
-                }
249
-                $return = join('.', $arr);
250
-            }
251
-        } else { // Otherwise we consider it being a pure domain name string
252
-            $return = $this->_decode($input);
253
-            if (!$return) $return = $input;
254
-        }
255
-        // The output is UTF-8 by default, other output formats need conversion here
256
-        // If one time encoding is given, use this, else the objects property
257
-        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
258
-        case 'utf8':
259
-            return $return;
260
-            break;
261
-        case 'ucs4_string':
262
-           return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
263
-           break;
264
-        case 'ucs4_array':
265
-            return $this->_utf8_to_ucs4($return);
266
-            break;
267
-        default:
268
-            $this->_error('Unsupported output format');
269
-            return false;
270
-        }
271
-    }
195
+		// Negotiate input and try to determine, whether it is a plain string,
196
+		// an email address or something like a complete URL
197
+		if (strpos($input, '@')) { // Maybe it is an email address
198
+			// No no in strict mode
199
+			if ($this->_strict_mode) {
200
+				$this->_error('Only simple domain name parts can be handled in strict mode');
201
+				return false;
202
+			}
203
+			list ($email_pref, $input) = explode('@', $input, 2);
204
+			$arr = explode('.', $input);
205
+			foreach ($arr as $k => $v) {
206
+				if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
207
+					$conv = $this->_decode($v);
208
+					if ($conv) $arr[$k] = $conv;
209
+				}
210
+			}
211
+			$input = join('.', $arr);
212
+			$arr = explode('.', $email_pref);
213
+			foreach ($arr as $k => $v) {
214
+				if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
215
+					$conv = $this->_decode($v);
216
+					if ($conv) $arr[$k] = $conv;
217
+				}
218
+			}
219
+			$email_pref = join('.', $arr);
220
+			$return = $email_pref . '@' . $input;
221
+		} elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
222
+			// No no in strict mode
223
+			if ($this->_strict_mode) {
224
+				$this->_error('Only simple domain name parts can be handled in strict mode');
225
+				return false;
226
+			}
227
+			$parsed = parse_url($input);
228
+			if (isset($parsed['host'])) {
229
+				$arr = explode('.', $parsed['host']);
230
+				foreach ($arr as $k => $v) {
231
+					$conv = $this->_decode($v);
232
+					if ($conv) $arr[$k] = $conv;
233
+				}
234
+				$parsed['host'] = join('.', $arr);
235
+				$return =
236
+						(empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
237
+						.(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
238
+						.$parsed['host']
239
+						.(empty($parsed['port']) ? '' : ':'.$parsed['port'])
240
+						.(empty($parsed['path']) ? '' : $parsed['path'])
241
+						.(empty($parsed['query']) ? '' : '?'.$parsed['query'])
242
+						.(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
243
+			} else { // parse_url seems to have failed, try without it
244
+				$arr = explode('.', $input);
245
+				foreach ($arr as $k => $v) {
246
+					$conv = $this->_decode($v);
247
+					$arr[$k] = ($conv) ? $conv : $v;
248
+				}
249
+				$return = join('.', $arr);
250
+			}
251
+		} else { // Otherwise we consider it being a pure domain name string
252
+			$return = $this->_decode($input);
253
+			if (!$return) $return = $input;
254
+		}
255
+		// The output is UTF-8 by default, other output formats need conversion here
256
+		// If one time encoding is given, use this, else the objects property
257
+		switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
258
+		case 'utf8':
259
+			return $return;
260
+			break;
261
+		case 'ucs4_string':
262
+		   return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
263
+		   break;
264
+		case 'ucs4_array':
265
+			return $this->_utf8_to_ucs4($return);
266
+			break;
267
+		default:
268
+			$this->_error('Unsupported output format');
269
+			return false;
270
+		}
271
+	}
272 272
 
273
-    /**
274
-     * Encode a given UTF-8 domain name
275
-     * @param    string   Domain name (UTF-8 or UCS-4)
276
-     * [@param    string   Desired input encoding, see {@link set_parameter}]
277
-     * @return   string   Encoded Domain name (ACE string)
278
-     */
279
-    public function encode($decoded, $one_time_encoding = false)
280
-    {
281
-        // Forcing conversion of input to UCS4 array
282
-        // If one time encoding is given, use this, else the objects property
283
-        switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
284
-        case 'utf8':
285
-            $decoded = $this->_utf8_to_ucs4($decoded);
286
-            break;
287
-        case 'ucs4_string':
288
-           $decoded = $this->_ucs4_string_to_ucs4($decoded);
289
-        case 'ucs4_array':
290
-           break;
291
-        default:
292
-            $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
293
-            return false;
294
-        }
273
+	/**
274
+	 * Encode a given UTF-8 domain name
275
+	 * @param    string   Domain name (UTF-8 or UCS-4)
276
+	 * [@param    string   Desired input encoding, see {@link set_parameter}]
277
+	 * @return   string   Encoded Domain name (ACE string)
278
+	 */
279
+	public function encode($decoded, $one_time_encoding = false)
280
+	{
281
+		// Forcing conversion of input to UCS4 array
282
+		// If one time encoding is given, use this, else the objects property
283
+		switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
284
+		case 'utf8':
285
+			$decoded = $this->_utf8_to_ucs4($decoded);
286
+			break;
287
+		case 'ucs4_string':
288
+		   $decoded = $this->_ucs4_string_to_ucs4($decoded);
289
+		case 'ucs4_array':
290
+		   break;
291
+		default:
292
+			$this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
293
+			return false;
294
+		}
295 295
 
296
-        // No input, no output, what else did you expect?
297
-        if (empty($decoded)) return '';
296
+		// No input, no output, what else did you expect?
297
+		if (empty($decoded)) return '';
298 298
 
299
-        // Anchors for iteration
300
-        $last_begin = 0;
301
-        // Output string
302
-        $output = '';
303
-        foreach ($decoded as $k => $v) {
304
-            // Make sure to use just the plain dot
305
-            switch($v) {
306
-            case 0x3002:
307
-            case 0xFF0E:
308
-            case 0xFF61:
309
-                $decoded[$k] = 0x2E;
310
-                // Right, no break here, the above are converted to dots anyway
311
-            // Stumbling across an anchoring character
312
-            case 0x2E:
313
-            case 0x2F:
314
-            case 0x3A:
315
-            case 0x3F:
316
-            case 0x40:
317
-                // Neither email addresses nor URLs allowed in strict mode
318
-                if ($this->_strict_mode) {
319
-                   $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
320
-                   return false;
321
-                } else {
322
-                    // Skip first char
323
-                    if ($k) {
324
-                        $encoded = '';
325
-                        $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
326
-                        if ($encoded) {
327
-                            $output .= $encoded;
328
-                        } else {
329
-                            $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
330
-                        }
331
-                        $output .= chr($decoded[$k]);
332
-                    }
333
-                    $last_begin = $k + 1;
334
-                }
335
-            }
336
-        }
337
-        // Catch the rest of the string
338
-        if ($last_begin) {
339
-            $inp_len = sizeof($decoded);
340
-            $encoded = '';
341
-            $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
342
-            if ($encoded) {
343
-                $output .= $encoded;
344
-            } else {
345
-                $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
346
-            }
347
-            return $output;
348
-        } else {
349
-            if ($output = $this->_encode($decoded)) {
350
-                return $output;
351
-            } else {
352
-                return $this->_ucs4_to_utf8($decoded);
353
-            }
354
-        }
355
-    }
299
+		// Anchors for iteration
300
+		$last_begin = 0;
301
+		// Output string
302
+		$output = '';
303
+		foreach ($decoded as $k => $v) {
304
+			// Make sure to use just the plain dot
305
+			switch($v) {
306
+			case 0x3002:
307
+			case 0xFF0E:
308
+			case 0xFF61:
309
+				$decoded[$k] = 0x2E;
310
+				// Right, no break here, the above are converted to dots anyway
311
+			// Stumbling across an anchoring character
312
+			case 0x2E:
313
+			case 0x2F:
314
+			case 0x3A:
315
+			case 0x3F:
316
+			case 0x40:
317
+				// Neither email addresses nor URLs allowed in strict mode
318
+				if ($this->_strict_mode) {
319
+				   $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
320
+				   return false;
321
+				} else {
322
+					// Skip first char
323
+					if ($k) {
324
+						$encoded = '';
325
+						$encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
326
+						if ($encoded) {
327
+							$output .= $encoded;
328
+						} else {
329
+							$output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
330
+						}
331
+						$output .= chr($decoded[$k]);
332
+					}
333
+					$last_begin = $k + 1;
334
+				}
335
+			}
336
+		}
337
+		// Catch the rest of the string
338
+		if ($last_begin) {
339
+			$inp_len = sizeof($decoded);
340
+			$encoded = '';
341
+			$encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
342
+			if ($encoded) {
343
+				$output .= $encoded;
344
+			} else {
345
+				$output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
346
+			}
347
+			return $output;
348
+		} else {
349
+			if ($output = $this->_encode($decoded)) {
350
+				return $output;
351
+			} else {
352
+				return $this->_ucs4_to_utf8($decoded);
353
+			}
354
+		}
355
+	}
356 356
 
357
-    /**
358
-     * Removes a weakness of encode(), which cannot properly handle URIs but instead encodes their
359
-     * path or query components, too.
360
-     * @param string  $uri  Expects the URI as a UTF-8 (or ASCII) string
361
-     * @return  string  The URI encoded to Punycode, everything but the host component is left alone
362
-     * @since 0.6.4
363
-     */
364
-    public function encode_uri($uri)
365
-    {
366
-        $parsed = parse_url($uri);
367
-        if (!isset($parsed['host'])) {
368
-            $this->_error('The given string does not look like a URI');
369
-            return false;
370
-        }
371
-        $arr = explode('.', $parsed['host']);
372
-        foreach ($arr as $k => $v) {
373
-            $conv = $this->encode($v, 'utf8');
374
-            if ($conv) $arr[$k] = $conv;
375
-        }
376
-        $parsed['host'] = join('.', $arr);
377
-        $return =
378
-                (empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
379
-                .(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
380
-                .$parsed['host']
381
-                .(empty($parsed['port']) ? '' : ':'.$parsed['port'])
382
-                .(empty($parsed['path']) ? '' : $parsed['path'])
383
-                .(empty($parsed['query']) ? '' : '?'.$parsed['query'])
384
-                .(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
385
-        return $return;
386
-    }
357
+	/**
358
+	 * Removes a weakness of encode(), which cannot properly handle URIs but instead encodes their
359
+	 * path or query components, too.
360
+	 * @param string  $uri  Expects the URI as a UTF-8 (or ASCII) string
361
+	 * @return  string  The URI encoded to Punycode, everything but the host component is left alone
362
+	 * @since 0.6.4
363
+	 */
364
+	public function encode_uri($uri)
365
+	{
366
+		$parsed = parse_url($uri);
367
+		if (!isset($parsed['host'])) {
368
+			$this->_error('The given string does not look like a URI');
369
+			return false;
370
+		}
371
+		$arr = explode('.', $parsed['host']);
372
+		foreach ($arr as $k => $v) {
373
+			$conv = $this->encode($v, 'utf8');
374
+			if ($conv) $arr[$k] = $conv;
375
+		}
376
+		$parsed['host'] = join('.', $arr);
377
+		$return =
378
+				(empty($parsed['scheme']) ? '' : $parsed['scheme'].(strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'))
379
+				.(empty($parsed['user']) ? '' : $parsed['user'].(empty($parsed['pass']) ? '' : ':'.$parsed['pass']).'@')
380
+				.$parsed['host']
381
+				.(empty($parsed['port']) ? '' : ':'.$parsed['port'])
382
+				.(empty($parsed['path']) ? '' : $parsed['path'])
383
+				.(empty($parsed['query']) ? '' : '?'.$parsed['query'])
384
+				.(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
385
+		return $return;
386
+	}
387 387
 
388
-    /**
389
-     * Use this method to get the last error ocurred
390
-     * @param    void
391
-     * @return   string   The last error, that occured
392
-     */
393
-    public function get_last_error()
394
-    {
395
-        return $this->_error;
396
-    }
388
+	/**
389
+	 * Use this method to get the last error ocurred
390
+	 * @param    void
391
+	 * @return   string   The last error, that occured
392
+	 */
393
+	public function get_last_error()
394
+	{
395
+		return $this->_error;
396
+	}
397 397
 
398
-    /**
399
-     * The actual decoding algorithm
400
-     * @param string
401
-     * @return mixed
402
-     */
403
-    protected function _decode($encoded)
404
-    {
405
-        $decoded = array();
406
-        // find the Punycode prefix
407
-        if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
408
-            $this->_error('This is not a punycode string');
409
-            return false;
410
-        }
411
-        $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
412
-        // If nothing left after removing the prefix, it is hopeless
413
-        if (!$encode_test) {
414
-            $this->_error('The given encoded string was empty');
415
-            return false;
416
-        }
417
-        // Find last occurence of the delimiter
418
-        $delim_pos = strrpos($encoded, '-');
419
-        if ($delim_pos > self::byteLength($this->_punycode_prefix)) {
420
-            for ($k = self::byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
421
-                $decoded[] = ord($encoded{$k});
422
-            }
423
-        }
424
-        $deco_len = count($decoded);
425
-        $enco_len = self::byteLength($encoded);
398
+	/**
399
+	 * The actual decoding algorithm
400
+	 * @param string
401
+	 * @return mixed
402
+	 */
403
+	protected function _decode($encoded)
404
+	{
405
+		$decoded = array();
406
+		// find the Punycode prefix
407
+		if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
408
+			$this->_error('This is not a punycode string');
409
+			return false;
410
+		}
411
+		$encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
412
+		// If nothing left after removing the prefix, it is hopeless
413
+		if (!$encode_test) {
414
+			$this->_error('The given encoded string was empty');
415
+			return false;
416
+		}
417
+		// Find last occurence of the delimiter
418
+		$delim_pos = strrpos($encoded, '-');
419
+		if ($delim_pos > self::byteLength($this->_punycode_prefix)) {
420
+			for ($k = self::byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
421
+				$decoded[] = ord($encoded{$k});
422
+			}
423
+		}
424
+		$deco_len = count($decoded);
425
+		$enco_len = self::byteLength($encoded);
426 426
 
427
-        // Wandering through the strings; init
428
-        $is_first = true;
429
-        $bias = $this->_initial_bias;
430
-        $idx = 0;
431
-        $char = $this->_initial_n;
427
+		// Wandering through the strings; init
428
+		$is_first = true;
429
+		$bias = $this->_initial_bias;
430
+		$idx = 0;
431
+		$char = $this->_initial_n;
432 432
 
433
-        for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
434
-            for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
435
-                $digit = $this->_decode_digit($encoded{$enco_idx++});
436
-                $idx += $digit * $w;
437
-                $t = ($k <= $bias) ? $this->_tmin :
438
-                        (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
439
-                if ($digit < $t) break;
440
-                $w = (int) ($w * ($this->_base - $t));
441
-            }
442
-            $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
443
-            $is_first = false;
444
-            $char += (int) ($idx / ($deco_len + 1));
445
-            $idx %= ($deco_len + 1);
446
-            if ($deco_len > 0) {
447
-                // Make room for the decoded char
448
-                for ($i = $deco_len; $i > $idx; $i--) $decoded[$i] = $decoded[($i - 1)];
449
-            }
450
-            $decoded[$idx++] = $char;
451
-        }
452
-        return $this->_ucs4_to_utf8($decoded);
453
-    }
433
+		for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
434
+			for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
435
+				$digit = $this->_decode_digit($encoded{$enco_idx++});
436
+				$idx += $digit * $w;
437
+				$t = ($k <= $bias) ? $this->_tmin :
438
+						(($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
439
+				if ($digit < $t) break;
440
+				$w = (int) ($w * ($this->_base - $t));
441
+			}
442
+			$bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
443
+			$is_first = false;
444
+			$char += (int) ($idx / ($deco_len + 1));
445
+			$idx %= ($deco_len + 1);
446
+			if ($deco_len > 0) {
447
+				// Make room for the decoded char
448
+				for ($i = $deco_len; $i > $idx; $i--) $decoded[$i] = $decoded[($i - 1)];
449
+			}
450
+			$decoded[$idx++] = $char;
451
+		}
452
+		return $this->_ucs4_to_utf8($decoded);
453
+	}
454 454
 
455
-    /**
456
-     * The actual encoding algorithm
457
-     * @param  string
458
-     * @return mixed
459
-     */
460
-    protected function _encode($decoded)
461
-    {
462
-        // We cannot encode a domain name containing the Punycode prefix
463
-        $extract = self::byteLength($this->_punycode_prefix);
464
-        $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
465
-        $check_deco = array_slice($decoded, 0, $extract);
455
+	/**
456
+	 * The actual encoding algorithm
457
+	 * @param  string
458
+	 * @return mixed
459
+	 */
460
+	protected function _encode($decoded)
461
+	{
462
+		// We cannot encode a domain name containing the Punycode prefix
463
+		$extract = self::byteLength($this->_punycode_prefix);
464
+		$check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
465
+		$check_deco = array_slice($decoded, 0, $extract);
466 466
 
467
-        if ($check_pref == $check_deco) {
468
-            $this->_error('This is already a punycode string');
469
-            return false;
470
-        }
471
-        // We will not try to encode strings consisting of basic code points only
472
-        $encodable = false;
473
-        foreach ($decoded as $k => $v) {
474
-            if ($v > 0x7a) {
475
-                $encodable = true;
476
-                break;
477
-            }
478
-        }
479
-        if (!$encodable) {
480
-            $this->_error('The given string does not contain encodable chars');
481
-            return false;
482
-        }
483
-        // Do NAMEPREP
484
-        $decoded = $this->_nameprep($decoded);
485
-        if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
486
-        $deco_len  = count($decoded);
487
-        if (!$deco_len) return false; // Empty array
488
-        $codecount = 0; // How many chars have been consumed
489
-        $encoded = '';
490
-        // Copy all basic code points to output
491
-        for ($i = 0; $i < $deco_len; ++$i) {
492
-            $test = $decoded[$i];
493
-            // Will match [-0-9a-zA-Z]
494
-            if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
495
-                    || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
496
-                $encoded .= chr($decoded[$i]);
497
-                $codecount++;
498
-            }
499
-        }
500
-        if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
467
+		if ($check_pref == $check_deco) {
468
+			$this->_error('This is already a punycode string');
469
+			return false;
470
+		}
471
+		// We will not try to encode strings consisting of basic code points only
472
+		$encodable = false;
473
+		foreach ($decoded as $k => $v) {
474
+			if ($v > 0x7a) {
475
+				$encodable = true;
476
+				break;
477
+			}
478
+		}
479
+		if (!$encodable) {
480
+			$this->_error('The given string does not contain encodable chars');
481
+			return false;
482
+		}
483
+		// Do NAMEPREP
484
+		$decoded = $this->_nameprep($decoded);
485
+		if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
486
+		$deco_len  = count($decoded);
487
+		if (!$deco_len) return false; // Empty array
488
+		$codecount = 0; // How many chars have been consumed
489
+		$encoded = '';
490
+		// Copy all basic code points to output
491
+		for ($i = 0; $i < $deco_len; ++$i) {
492
+			$test = $decoded[$i];
493
+			// Will match [-0-9a-zA-Z]
494
+			if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B)
495
+					|| (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
496
+				$encoded .= chr($decoded[$i]);
497
+				$codecount++;
498
+			}
499
+		}
500
+		if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
501 501
 
502
-        // Start with the prefix; copy it to output
503
-        $encoded = $this->_punycode_prefix.$encoded;
504
-        // If we have basic code points in output, add an hyphen to the end
505
-        if ($codecount) $encoded .= '-';
506
-        // Now find and encode all non-basic code points
507
-        $is_first = true;
508
-        $cur_code = $this->_initial_n;
509
-        $bias = $this->_initial_bias;
510
-        $delta = 0;
511
-        while ($codecount < $deco_len) {
512
-            // Find the smallest code point >= the current code point and
513
-            // remember the last ouccrence of it in the input
514
-            for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
515
-                if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
516
-                    $next_code = $decoded[$i];
517
-                }
518
-            }
519
-            $delta += ($next_code - $cur_code) * ($codecount + 1);
520
-            $cur_code = $next_code;
502
+		// Start with the prefix; copy it to output
503
+		$encoded = $this->_punycode_prefix.$encoded;
504
+		// If we have basic code points in output, add an hyphen to the end
505
+		if ($codecount) $encoded .= '-';
506
+		// Now find and encode all non-basic code points
507
+		$is_first = true;
508
+		$cur_code = $this->_initial_n;
509
+		$bias = $this->_initial_bias;
510
+		$delta = 0;
511
+		while ($codecount < $deco_len) {
512
+			// Find the smallest code point >= the current code point and
513
+			// remember the last ouccrence of it in the input
514
+			for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
515
+				if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
516
+					$next_code = $decoded[$i];
517
+				}
518
+			}
519
+			$delta += ($next_code - $cur_code) * ($codecount + 1);
520
+			$cur_code = $next_code;
521 521
 
522
-            // Scan input again and encode all characters whose code point is $cur_code
523
-            for ($i = 0; $i < $deco_len; $i++) {
524
-                if ($decoded[$i] < $cur_code) {
525
-                    $delta++;
526
-                } elseif ($decoded[$i] == $cur_code) {
527
-                    for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
528
-                        $t = ($k <= $bias) ? $this->_tmin :
529
-                                (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
530
-                        if ($q < $t) break;
531
-                        $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
532
-                        $q = (int) (($q - $t) / ($this->_base - $t));
533
-                    }
534
-                    $encoded .= $this->_encode_digit($q);
535
-                    $bias = $this->_adapt($delta, $codecount+1, $is_first);
536
-                    $codecount++;
537
-                    $delta = 0;
538
-                    $is_first = false;
539
-                }
540
-            }
541
-            $delta++;
542
-            $cur_code++;
543
-        }
544
-        return $encoded;
545
-    }
522
+			// Scan input again and encode all characters whose code point is $cur_code
523
+			for ($i = 0; $i < $deco_len; $i++) {
524
+				if ($decoded[$i] < $cur_code) {
525
+					$delta++;
526
+				} elseif ($decoded[$i] == $cur_code) {
527
+					for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
528
+						$t = ($k <= $bias) ? $this->_tmin :
529
+								(($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
530
+						if ($q < $t) break;
531
+						$encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
532
+						$q = (int) (($q - $t) / ($this->_base - $t));
533
+					}
534
+					$encoded .= $this->_encode_digit($q);
535
+					$bias = $this->_adapt($delta, $codecount+1, $is_first);
536
+					$codecount++;
537
+					$delta = 0;
538
+					$is_first = false;
539
+				}
540
+			}
541
+			$delta++;
542
+			$cur_code++;
543
+		}
544
+		return $encoded;
545
+	}
546 546
 
547
-    /**
548
-     * Adapt the bias according to the current code point and position
549
-     * @param int $delta
550
-     * @param int $npoints
551
-     * @param int $is_first
552
-     * @return int
553
-     */
554
-    protected function _adapt($delta, $npoints, $is_first)
555
-    {
556
-        $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
557
-        $delta += intval($delta / $npoints);
558
-        for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
559
-            $delta = intval($delta / ($this->_base - $this->_tmin));
560
-        }
561
-        return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
562
-    }
547
+	/**
548
+	 * Adapt the bias according to the current code point and position
549
+	 * @param int $delta
550
+	 * @param int $npoints
551
+	 * @param int $is_first
552
+	 * @return int
553
+	 */
554
+	protected function _adapt($delta, $npoints, $is_first)
555
+	{
556
+		$delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
557
+		$delta += intval($delta / $npoints);
558
+		for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
559
+			$delta = intval($delta / ($this->_base - $this->_tmin));
560
+		}
561
+		return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
562
+	}
563 563
 
564
-    /**
565
-     * Encoding a certain digit
566
-     * @param    int $d
567
-     * @return string
568
-     */
569
-    protected function _encode_digit($d)
570
-    {
571
-        return chr($d + 22 + 75 * ($d < 26));
572
-    }
564
+	/**
565
+	 * Encoding a certain digit
566
+	 * @param    int $d
567
+	 * @return string
568
+	 */
569
+	protected function _encode_digit($d)
570
+	{
571
+		return chr($d + 22 + 75 * ($d < 26));
572
+	}
573 573
 
574
-    /**
575
-     * Decode a certain digit
576
-     * @param    int $cp
577
-     * @return int
578
-     */
579
-    protected function _decode_digit($cp)
580
-    {
581
-        $cp = ord($cp);
582
-        return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
583
-    }
574
+	/**
575
+	 * Decode a certain digit
576
+	 * @param    int $cp
577
+	 * @return int
578
+	 */
579
+	protected function _decode_digit($cp)
580
+	{
581
+		$cp = ord($cp);
582
+		return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
583
+	}
584 584
 
585
-    /**
586
-     * Internal error handling method
587
-     * @param  string $error
588
-     */
589
-    protected function _error($error = '')
590
-    {
591
-        $this->_error = $error;
592
-    }
585
+	/**
586
+	 * Internal error handling method
587
+	 * @param  string $error
588
+	 */
589
+	protected function _error($error = '')
590
+	{
591
+		$this->_error = $error;
592
+	}
593 593
 
594
-    /**
595
-     * Do Nameprep according to RFC3491 and RFC3454
596
-     * @param    array    Unicode Characters
597
-     * @return   string   Unicode Characters, Nameprep'd
598
-     */
599
-    protected function _nameprep($input)
600
-    {
601
-        $output = array();
602
-        $error = false;
603
-        //
604
-        // Mapping
605
-        // Walking through the input array, performing the required steps on each of
606
-        // the input chars and putting the result into the output array
607
-        // While mapping required chars we apply the cannonical ordering
608
-        foreach ($input as $v) {
609
-            // Map to nothing == skip that code point
610
-            if (in_array($v, self::$NP['map_nothing'])) continue;
611
-            // Try to find prohibited input
612
-            if (in_array($v, self::$NP['prohibit']) || in_array($v, self::$NP['general_prohibited'])) {
613
-                $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
614
-                return false;
615
-            }
616
-            foreach (self::$NP['prohibit_ranges'] as $range) {
617
-                if ($range[0] <= $v && $v <= $range[1]) {
618
-                    $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
619
-                    return false;
620
-                }
621
-            }
594
+	/**
595
+	 * Do Nameprep according to RFC3491 and RFC3454
596
+	 * @param    array    Unicode Characters
597
+	 * @return   string   Unicode Characters, Nameprep'd
598
+	 */
599
+	protected function _nameprep($input)
600
+	{
601
+		$output = array();
602
+		$error = false;
603
+		//
604
+		// Mapping
605
+		// Walking through the input array, performing the required steps on each of
606
+		// the input chars and putting the result into the output array
607
+		// While mapping required chars we apply the cannonical ordering
608
+		foreach ($input as $v) {
609
+			// Map to nothing == skip that code point
610
+			if (in_array($v, self::$NP['map_nothing'])) continue;
611
+			// Try to find prohibited input
612
+			if (in_array($v, self::$NP['prohibit']) || in_array($v, self::$NP['general_prohibited'])) {
613
+				$this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
614
+				return false;
615
+			}
616
+			foreach (self::$NP['prohibit_ranges'] as $range) {
617
+				if ($range[0] <= $v && $v <= $range[1]) {
618
+					$this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v));
619
+					return false;
620
+				}
621
+			}
622 622
 
623
-            if (0xAC00 <= $v && $v <= 0xD7AF) {
624
-                // Hangul syllable decomposition
625
-                foreach ($this->_hangul_decompose($v) as $out) {
626
-                    $output[] = (int) $out;
627
-                }
628
-            } elseif (($this->_idn_version == '2003') && isset(self::$NP['replacemaps'][$v])) {
629
-                // There's a decomposition mapping for that code point
630
-                // Decompositions only in version 2003 (original) of IDNA
631
-                foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps'][$v]) as $out) {
632
-                    $output[] = (int) $out;
633
-                }
634
-            } else {
635
-                $output[] = (int) $v;
636
-            }
637
-        }
638
-        // Before applying any Combining, try to rearrange any Hangul syllables
639
-        $output = $this->_hangul_compose($output);
640
-        //
641
-        // Combine code points
642
-        //
643
-        $last_class = 0;
644
-        $last_starter = 0;
645
-        $out_len = count($output);
646
-        for ($i = 0; $i < $out_len; ++$i) {
647
-            $class = $this->_get_combining_class($output[$i]);
648
-            if ((!$last_class || $last_class > $class) && $class) {
649
-                // Try to match
650
-                $seq_len = $i - $last_starter;
651
-                $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
652
-                // On match: Replace the last starter with the composed character and remove
653
-                // the now redundant non-starter(s)
654
-                if ($out) {
655
-                    $output[$last_starter] = $out;
656
-                    if (count($out) != $seq_len) {
657
-                        for ($j = $i+1; $j < $out_len; ++$j) $output[$j-1] = $output[$j];
658
-                        unset($output[$out_len]);
659
-                    }
660
-                    // Rewind the for loop by one, since there can be more possible compositions
661
-                    $i--;
662
-                    $out_len--;
663
-                    $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
664
-                    continue;
665
-                }
666
-            }
667
-            // The current class is 0
668
-            if (!$class) $last_starter = $i;
669
-            $last_class = $class;
670
-        }
671
-        return $output;
672
-    }
623
+			if (0xAC00 <= $v && $v <= 0xD7AF) {
624
+				// Hangul syllable decomposition
625
+				foreach ($this->_hangul_decompose($v) as $out) {
626
+					$output[] = (int) $out;
627
+				}
628
+			} elseif (($this->_idn_version == '2003') && isset(self::$NP['replacemaps'][$v])) {
629
+				// There's a decomposition mapping for that code point
630
+				// Decompositions only in version 2003 (original) of IDNA
631
+				foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps'][$v]) as $out) {
632
+					$output[] = (int) $out;
633
+				}
634
+			} else {
635
+				$output[] = (int) $v;
636
+			}
637
+		}
638
+		// Before applying any Combining, try to rearrange any Hangul syllables
639
+		$output = $this->_hangul_compose($output);
640
+		//
641
+		// Combine code points
642
+		//
643
+		$last_class = 0;
644
+		$last_starter = 0;
645
+		$out_len = count($output);
646
+		for ($i = 0; $i < $out_len; ++$i) {
647
+			$class = $this->_get_combining_class($output[$i]);
648
+			if ((!$last_class || $last_class > $class) && $class) {
649
+				// Try to match
650
+				$seq_len = $i - $last_starter;
651
+				$out = $this->_combine(array_slice($output, $last_starter, $seq_len));
652
+				// On match: Replace the last starter with the composed character and remove
653
+				// the now redundant non-starter(s)
654
+				if ($out) {
655
+					$output[$last_starter] = $out;
656
+					if (count($out) != $seq_len) {
657
+						for ($j = $i+1; $j < $out_len; ++$j) $output[$j-1] = $output[$j];
658
+						unset($output[$out_len]);
659
+					}
660
+					// Rewind the for loop by one, since there can be more possible compositions
661
+					$i--;
662
+					$out_len--;
663
+					$last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i-1]);
664
+					continue;
665
+				}
666
+			}
667
+			// The current class is 0
668
+			if (!$class) $last_starter = $i;
669
+			$last_class = $class;
670
+		}
671
+		return $output;
672
+	}
673 673
 
674
-    /**
675
-     * Decomposes a Hangul syllable
676
-     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
677
-     * @param    integer  32bit UCS4 code point
678
-     * @return   array    Either Hangul Syllable decomposed or original 32bit value as one value array
679
-     */
680
-    protected function _hangul_decompose($char)
681
-    {
682
-        $sindex = (int) $char - $this->_sbase;
683
-        if ($sindex < 0 || $sindex >= $this->_scount) return array($char);
684
-        $result = array();
685
-        $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
686
-        $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
687
-        $T = intval($this->_tbase + $sindex % $this->_tcount);
688
-        if ($T != $this->_tbase) $result[] = $T;
689
-        return $result;
690
-    }
691
-    /**
692
-     * Ccomposes a Hangul syllable
693
-     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
694
-     * @param    array    Decomposed UCS4 sequence
695
-     * @return   array    UCS4 sequence with syllables composed
696
-     */
697
-    protected function _hangul_compose($input)
698
-    {
699
-        $inp_len = count($input);
700
-        if (!$inp_len) return array();
701
-        $result = array();
702
-        $last = (int) $input[0];
703
-        $result[] = $last; // copy first char from input to output
674
+	/**
675
+	 * Decomposes a Hangul syllable
676
+	 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
677
+	 * @param    integer  32bit UCS4 code point
678
+	 * @return   array    Either Hangul Syllable decomposed or original 32bit value as one value array
679
+	 */
680
+	protected function _hangul_decompose($char)
681
+	{
682
+		$sindex = (int) $char - $this->_sbase;
683
+		if ($sindex < 0 || $sindex >= $this->_scount) return array($char);
684
+		$result = array();
685
+		$result[] = (int) $this->_lbase + $sindex / $this->_ncount;
686
+		$result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
687
+		$T = intval($this->_tbase + $sindex % $this->_tcount);
688
+		if ($T != $this->_tbase) $result[] = $T;
689
+		return $result;
690
+	}
691
+	/**
692
+	 * Ccomposes a Hangul syllable
693
+	 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
694
+	 * @param    array    Decomposed UCS4 sequence
695
+	 * @return   array    UCS4 sequence with syllables composed
696
+	 */
697
+	protected function _hangul_compose($input)
698
+	{
699
+		$inp_len = count($input);
700
+		if (!$inp_len) return array();
701
+		$result = array();
702
+		$last = (int) $input[0];
703
+		$result[] = $last; // copy first char from input to output
704 704
 
705
-        for ($i = 1; $i < $inp_len; ++$i) {
706
-            $char = (int) $input[$i];
707
-            $sindex = $last - $this->_sbase;
708
-            $lindex = $last - $this->_lbase;
709
-            $vindex = $char - $this->_vbase;
710
-            $tindex = $char - $this->_tbase;
711
-            // Find out, whether two current characters are LV and T
712
-            if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
713
-                    && 0 <= $tindex && $tindex <= $this->_tcount) {
714
-                // create syllable of form LVT
715
-                $last += $tindex;
716
-                $result[(count($result) - 1)] = $last; // reset last
717
-                continue; // discard char
718
-            }
719
-            // Find out, whether two current characters form L and V
720
-            if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
721
-                // create syllable of form LV
722
-                $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
723
-                $result[(count($result) - 1)] = $last; // reset last
724
-                continue; // discard char
725
-            }
726
-            // if neither case was true, just add the character
727
-            $last = $char;
728
-            $result[] = $char;
729
-        }
730
-        return $result;
731
-    }
705
+		for ($i = 1; $i < $inp_len; ++$i) {
706
+			$char = (int) $input[$i];
707
+			$sindex = $last - $this->_sbase;
708
+			$lindex = $last - $this->_lbase;
709
+			$vindex = $char - $this->_vbase;
710
+			$tindex = $char - $this->_tbase;
711
+			// Find out, whether two current characters are LV and T
712
+			if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0)
713
+					&& 0 <= $tindex && $tindex <= $this->_tcount) {
714
+				// create syllable of form LVT
715
+				$last += $tindex;
716
+				$result[(count($result) - 1)] = $last; // reset last
717
+				continue; // discard char
718
+			}
719
+			// Find out, whether two current characters form L and V
720
+			if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
721
+				// create syllable of form LV
722
+				$last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
723
+				$result[(count($result) - 1)] = $last; // reset last
724
+				continue; // discard char
725
+			}
726
+			// if neither case was true, just add the character
727
+			$last = $char;
728
+			$result[] = $char;
729
+		}
730
+		return $result;
731
+	}
732 732
 
733
-    /**
734
-     * Returns the combining class of a certain wide char
735
-     * @param    integer    Wide char to check (32bit integer)
736
-     * @return   integer    Combining class if found, else 0
737
-     */
738
-    protected function _get_combining_class($char)
739
-    {
740
-        return isset(self::$NP['norm_combcls'][$char]) ? self::$NP['norm_combcls'][$char] : 0;
741
-    }
733
+	/**
734
+	 * Returns the combining class of a certain wide char
735
+	 * @param    integer    Wide char to check (32bit integer)
736
+	 * @return   integer    Combining class if found, else 0
737
+	 */
738
+	protected function _get_combining_class($char)
739
+	{
740
+		return isset(self::$NP['norm_combcls'][$char]) ? self::$NP['norm_combcls'][$char] : 0;
741
+	}
742 742
 
743
-    /**
744
-     * Applies the cannonical ordering of a decomposed UCS4 sequence
745
-     * @param    array      Decomposed UCS4 sequence
746
-     * @return   array      Ordered USC4 sequence
747
-     */
748
-    protected function _apply_cannonical_ordering($input)
749
-    {
750
-        $swap = true;
751
-        $size = count($input);
752
-        while ($swap) {
753
-            $swap = false;
754
-            $last = $this->_get_combining_class(intval($input[0]));
755
-            for ($i = 0; $i < $size-1; ++$i) {
756
-                $next = $this->_get_combining_class(intval($input[$i+1]));
757
-                if ($next != 0 && $last > $next) {
758
-                    // Move item leftward until it fits
759
-                    for ($j = $i + 1; $j > 0; --$j) {
760
-                        if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
761
-                        $t = intval($input[$j]);
762
-                        $input[$j] = intval($input[$j-1]);
763
-                        $input[$j-1] = $t;
764
-                        $swap = true;
765
-                    }
766
-                    // Reentering the loop looking at the old character again
767
-                    $next = $last;
768
-                }
769
-                $last = $next;
770
-            }
771
-        }
772
-        return $input;
773
-    }
743
+	/**
744
+	 * Applies the cannonical ordering of a decomposed UCS4 sequence
745
+	 * @param    array      Decomposed UCS4 sequence
746
+	 * @return   array      Ordered USC4 sequence
747
+	 */
748
+	protected function _apply_cannonical_ordering($input)
749
+	{
750
+		$swap = true;
751
+		$size = count($input);
752
+		while ($swap) {
753
+			$swap = false;
754
+			$last = $this->_get_combining_class(intval($input[0]));
755
+			for ($i = 0; $i < $size-1; ++$i) {
756
+				$next = $this->_get_combining_class(intval($input[$i+1]));
757
+				if ($next != 0 && $last > $next) {
758
+					// Move item leftward until it fits
759
+					for ($j = $i + 1; $j > 0; --$j) {
760
+						if ($this->_get_combining_class(intval($input[$j-1])) <= $next) break;
761
+						$t = intval($input[$j]);
762
+						$input[$j] = intval($input[$j-1]);
763
+						$input[$j-1] = $t;
764
+						$swap = true;
765
+					}
766
+					// Reentering the loop looking at the old character again
767
+					$next = $last;
768
+				}
769
+				$last = $next;
770
+			}
771
+		}
772
+		return $input;
773
+	}
774 774
 
775
-    /**
776
-     * Do composition of a sequence of starter and non-starter
777
-     * @param    array      UCS4 Decomposed sequence
778
-     * @return   array      Ordered USC4 sequence
779
-     */
780
-    protected function _combine($input)
781
-    {
782
-        $inp_len = count($input);
783
-        foreach (self::$NP['replacemaps'] as $np_src => $np_target) {
784
-            if ($np_target[0] != $input[0]) continue;
785
-            if (count($np_target) != $inp_len) continue;
786
-            $hit = false;
787
-            foreach ($input as $k2 => $v2) {
788
-                if ($v2 == $np_target[$k2]) {
789
-                    $hit = true;
790
-                } else {
791
-                    $hit = false;
792
-                    break;
793
-                }
794
-            }
795
-            if ($hit) return $np_src;
796
-        }
797
-        return false;
798
-    }
775
+	/**
776
+	 * Do composition of a sequence of starter and non-starter
777
+	 * @param    array      UCS4 Decomposed sequence
778
+	 * @return   array      Ordered USC4 sequence
779
+	 */
780
+	protected function _combine($input)
781
+	{
782
+		$inp_len = count($input);
783
+		foreach (self::$NP['replacemaps'] as $np_src => $np_target) {
784
+			if ($np_target[0] != $input[0]) continue;
785
+			if (count($np_target) != $inp_len) continue;
786
+			$hit = false;
787
+			foreach ($input as $k2 => $v2) {
788
+				if ($v2 == $np_target[$k2]) {
789
+					$hit = true;
790
+				} else {
791
+					$hit = false;
792
+					break;
793
+				}
794
+			}
795
+			if ($hit) return $np_src;
796
+		}
797
+		return false;
798
+	}
799 799
 
800
-    /**
801
-     * This converts an UTF-8 encoded string to its UCS-4 representation
802
-     * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
803
-     * each of the "chars". This is due to PHP not being able to handle strings with
804
-     * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
805
-     * The following UTF-8 encodings are supported:
806
-     * bytes bits  representation
807
-     * 1        7  0xxxxxxx
808
-     * 2       11  110xxxxx 10xxxxxx
809
-     * 3       16  1110xxxx 10xxxxxx 10xxxxxx
810
-     * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
811
-     * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
812
-     * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
813
-     * Each x represents a bit that can be used to store character data.
814
-     * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
815
-     * @param string $input
816
-     * @return string
817
-     */
818
-    protected function _utf8_to_ucs4($input)
819
-    {
820
-        $output = array();
821
-        $out_len = 0;
822
-        $inp_len = self::byteLength($input);
823
-        $mode = 'next';
824
-        $test = 'none';
825
-        for ($k = 0; $k < $inp_len; ++$k) {
826
-            $v = ord($input{$k}); // Extract byte from input string
827
-            if ($v < 128) { // We found an ASCII char - put into stirng as is
828
-                $output[$out_len] = $v;
829
-                ++$out_len;
830
-                if ('add' == $mode) {
831
-                    $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
832
-                    return false;
833
-                }
834
-                continue;
835
-            }
836
-            if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
837
-                $start_byte = $v;
838
-                $mode = 'add';
839
-                $test = 'range';
840
-                if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
841
-                    $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
842
-                    $v = ($v - 192) << 6;
843
-                } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
844
-                    $next_byte = 1;
845
-                    $v = ($v - 224) << 12;
846
-                } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
847
-                    $next_byte = 2;
848
-                    $v = ($v - 240) << 18;
849
-                } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
850
-                    $next_byte = 3;
851
-                    $v = ($v - 248) << 24;
852
-                } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
853
-                    $next_byte = 4;
854
-                    $v = ($v - 252) << 30;
855
-                } else {
856
-                    $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
857
-                    return false;
858
-                }
859
-                if ('add' == $mode) {
860
-                    $output[$out_len] = (int) $v;
861
-                    ++$out_len;
862
-                    continue;
863
-                }
864
-            }
865
-            if ('add' == $mode) {
866
-                if (!$this->_allow_overlong && $test == 'range') {
867
-                    $test = 'none';
868
-                    if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
869
-                        $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
870
-                        return false;
871
-                    }
872
-                }
873
-                if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
874
-                    $v = ($v - 128) << ($next_byte * 6);
875
-                    $output[($out_len - 1)] += $v;
876
-                    --$next_byte;
877
-                } else {
878
-                    $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
879
-                    return false;
880
-                }
881
-                if ($next_byte < 0) {
882
-                    $mode = 'next';
883
-                }
884
-            }
885
-        } // for
886
-        return $output;
887
-    }
800
+	/**
801
+	 * This converts an UTF-8 encoded string to its UCS-4 representation
802
+	 * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
803
+	 * each of the "chars". This is due to PHP not being able to handle strings with
804
+	 * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
805
+	 * The following UTF-8 encodings are supported:
806
+	 * bytes bits  representation
807
+	 * 1        7  0xxxxxxx
808
+	 * 2       11  110xxxxx 10xxxxxx
809
+	 * 3       16  1110xxxx 10xxxxxx 10xxxxxx
810
+	 * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
811
+	 * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
812
+	 * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
813
+	 * Each x represents a bit that can be used to store character data.
814
+	 * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
815
+	 * @param string $input
816
+	 * @return string
817
+	 */
818
+	protected function _utf8_to_ucs4($input)
819
+	{
820
+		$output = array();
821
+		$out_len = 0;
822
+		$inp_len = self::byteLength($input);
823
+		$mode = 'next';
824
+		$test = 'none';
825
+		for ($k = 0; $k < $inp_len; ++$k) {
826
+			$v = ord($input{$k}); // Extract byte from input string
827
+			if ($v < 128) { // We found an ASCII char - put into stirng as is
828
+				$output[$out_len] = $v;
829
+				++$out_len;
830
+				if ('add' == $mode) {
831
+					$this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
832
+					return false;
833
+				}
834
+				continue;
835
+			}
836
+			if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
837
+				$start_byte = $v;
838
+				$mode = 'add';
839
+				$test = 'range';
840
+				if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
841
+					$next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
842
+					$v = ($v - 192) << 6;
843
+				} elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
844
+					$next_byte = 1;
845
+					$v = ($v - 224) << 12;
846
+				} elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
847
+					$next_byte = 2;
848
+					$v = ($v - 240) << 18;
849
+				} elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
850
+					$next_byte = 3;
851
+					$v = ($v - 248) << 24;
852
+				} elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
853
+					$next_byte = 4;
854
+					$v = ($v - 252) << 30;
855
+				} else {
856
+					$this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k);
857
+					return false;
858
+				}
859
+				if ('add' == $mode) {
860
+					$output[$out_len] = (int) $v;
861
+					++$out_len;
862
+					continue;
863
+				}
864
+			}
865
+			if ('add' == $mode) {
866
+				if (!$this->_allow_overlong && $test == 'range') {
867
+					$test = 'none';
868
+					if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
869
+						$this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
870
+						return false;
871
+					}
872
+				}
873
+				if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
874
+					$v = ($v - 128) << ($next_byte * 6);
875
+					$output[($out_len - 1)] += $v;
876
+					--$next_byte;
877
+				} else {
878
+					$this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
879
+					return false;
880
+				}
881
+				if ($next_byte < 0) {
882
+					$mode = 'next';
883
+				}
884
+			}
885
+		} // for
886
+		return $output;
887
+	}
888 888
 
889
-    /**
890
-     * Convert UCS-4 string into UTF-8 string
891
-     * See _utf8_to_ucs4() for details
892
-     * @param string  $input
893
-     * @return string
894
-     */
895
-    protected function _ucs4_to_utf8($input)
896
-    {
897
-        $output = '';
898
-        foreach ($input as $k => $v) {
899
-            if ($v < 128) { // 7bit are transferred literally
900
-                $output .= chr($v);
901
-            } elseif ($v < (1 << 11)) { // 2 bytes
902
-                $output .= chr(192+($v >> 6)).chr(128+($v & 63));
903
-            } elseif ($v < (1 << 16)) { // 3 bytes
904
-                $output .= chr(224+($v >> 12)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
905
-            } elseif ($v < (1 << 21)) { // 4 bytes
906
-                $output .= chr(240+($v >> 18)).chr(128+(($v >> 12) & 63)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
907
-            } elseif (self::$safe_mode) {
908
-                $output .= self::$safe_char;
909
-            } else {
910
-                $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
911
-                return false;
912
-            }
913
-        }
914
-        return $output;
915
-    }
889
+	/**
890
+	 * Convert UCS-4 string into UTF-8 string
891
+	 * See _utf8_to_ucs4() for details
892
+	 * @param string  $input
893
+	 * @return string
894
+	 */
895
+	protected function _ucs4_to_utf8($input)
896
+	{
897
+		$output = '';
898
+		foreach ($input as $k => $v) {
899
+			if ($v < 128) { // 7bit are transferred literally
900
+				$output .= chr($v);
901
+			} elseif ($v < (1 << 11)) { // 2 bytes
902
+				$output .= chr(192+($v >> 6)).chr(128+($v & 63));
903
+			} elseif ($v < (1 << 16)) { // 3 bytes
904
+				$output .= chr(224+($v >> 12)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
905
+			} elseif ($v < (1 << 21)) { // 4 bytes
906
+				$output .= chr(240+($v >> 18)).chr(128+(($v >> 12) & 63)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
907
+			} elseif (self::$safe_mode) {
908
+				$output .= self::$safe_char;
909
+			} else {
910
+				$this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
911
+				return false;
912
+			}
913
+		}
914
+		return $output;
915
+	}
916 916
 
917
-    /**
918
-     * Convert UCS-4 array into UCS-4 string
919
-     *
920
-     * @param array $input
921
-     * @return string
922
-     */
923
-    protected function _ucs4_to_ucs4_string($input)
924
-    {
925
-        $output = '';
926
-        // Take array values and split output to 4 bytes per value
927
-        // The bit mask is 255, which reads &11111111
928
-        foreach ($input as $v) {
929
-            $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
930
-        }
931
-        return $output;
932
-    }
917
+	/**
918
+	 * Convert UCS-4 array into UCS-4 string
919
+	 *
920
+	 * @param array $input
921
+	 * @return string
922
+	 */
923
+	protected function _ucs4_to_ucs4_string($input)
924
+	{
925
+		$output = '';
926
+		// Take array values and split output to 4 bytes per value
927
+		// The bit mask is 255, which reads &11111111
928
+		foreach ($input as $v) {
929
+			$output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
930
+		}
931
+		return $output;
932
+	}
933 933
 
934
-    /**
935
-     * Convert UCS-4 strin into UCS-4 garray
936
-     *
937
-     * @param  string $input
938
-     * @return array
939
-     */
940
-    protected function _ucs4_string_to_ucs4($input)
941
-    {
942
-        $output = array();
943
-        $inp_len = self::byteLength($input);
944
-        // Input length must be dividable by 4
945
-        if ($inp_len % 4) {
946
-            $this->_error('Input UCS4 string is broken');
947
-            return false;
948
-        }
949
-        // Empty input - return empty output
950
-        if (!$inp_len) return $output;
951
-        for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
952
-            // Increment output position every 4 input bytes
953
-            if (!($i % 4)) {
954
-                $out_len++;
955
-                $output[$out_len] = 0;
956
-            }
957
-            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
958
-        }
959
-        return $output;
960
-    }
934
+	/**
935
+	 * Convert UCS-4 strin into UCS-4 garray
936
+	 *
937
+	 * @param  string $input
938
+	 * @return array
939
+	 */
940
+	protected function _ucs4_string_to_ucs4($input)
941
+	{
942
+		$output = array();
943
+		$inp_len = self::byteLength($input);
944
+		// Input length must be dividable by 4
945
+		if ($inp_len % 4) {
946
+			$this->_error('Input UCS4 string is broken');
947
+			return false;
948
+		}
949
+		// Empty input - return empty output
950
+		if (!$inp_len) return $output;
951
+		for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
952
+			// Increment output position every 4 input bytes
953
+			if (!($i % 4)) {
954
+				$out_len++;
955
+				$output[$out_len] = 0;
956
+			}
957
+			$output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
958
+		}
959
+		return $output;
960
+	}
961 961
 
962
-    /**
963
-     * Gets the length of a string in bytes even if mbstring function
964
-     * overloading is turned on
965
-     *
966
-     * @param string $string the string for which to get the length.
967
-     * @return integer the length of the string in bytes.
968
-     */
969
-    protected static function byteLength($string)
970
-    {
971
-        if (self::$_mb_string_overload) {
972
-            return mb_strlen($string, '8bit');
973
-        }
974
-        return strlen((binary) $string);
975
-    }
962
+	/**
963
+	 * Gets the length of a string in bytes even if mbstring function
964
+	 * overloading is turned on
965
+	 *
966
+	 * @param string $string the string for which to get the length.
967
+	 * @return integer the length of the string in bytes.
968
+	 */
969
+	protected static function byteLength($string)
970
+	{
971
+		if (self::$_mb_string_overload) {
972
+			return mb_strlen($string, '8bit');
973
+		}
974
+		return strlen((binary) $string);
975
+	}
976 976
 
977
-    /**
978
-     * Attempts to return a concrete IDNA instance.
979
-     *
980
-     * @param array $params Set of paramaters
981
-     * @return idna_convert
982
-     * @access public
983
-     */
984
-    public function getInstance($params = array())
985
-    {
986
-        return new idna_convert($params);
987
-    }
977
+	/**
978
+	 * Attempts to return a concrete IDNA instance.
979
+	 *
980
+	 * @param array $params Set of paramaters
981
+	 * @return idna_convert
982
+	 * @access public
983
+	 */
984
+	public function getInstance($params = array())
985
+	{
986
+		return new idna_convert($params);
987
+	}
988 988
 
989
-    /**
990
-     * Attempts to return a concrete IDNA instance for either php4 or php5,
991
-     * only creating a new instance if no IDNA instance with the same
992
-     * parameters currently exists.
993
-     *
994
-     * @param array $params Set of paramaters
995
-     *
996
-     * @return object idna_convert
997
-     * @access public
998
-     */
999
-    public function singleton($params = array())
1000
-    {
1001
-        static $instances;
1002
-        if (!isset($instances)) {
1003
-            $instances = array();
1004
-        }
1005
-        $signature = serialize($params);
1006
-        if (!isset($instances[$signature])) {
1007
-            $instances[$signature] = idna_convert::getInstance($params);
1008
-        }
1009
-        return $instances[$signature];
1010
-    }
989
+	/**
990
+	 * Attempts to return a concrete IDNA instance for either php4 or php5,
991
+	 * only creating a new instance if no IDNA instance with the same
992
+	 * parameters currently exists.
993
+	 *
994
+	 * @param array $params Set of paramaters
995
+	 *
996
+	 * @return object idna_convert
997
+	 * @access public
998
+	 */
999
+	public function singleton($params = array())
1000
+	{
1001
+		static $instances;
1002
+		if (!isset($instances)) {
1003
+			$instances = array();
1004
+		}
1005
+		$signature = serialize($params);
1006
+		if (!isset($instances[$signature])) {
1007
+			$instances[$signature] = idna_convert::getInstance($params);
1008
+		}
1009
+		return $instances[$signature];
1010
+	}
1011 1011
 
1012
-    /**
1013
-     * Holds all relevant mapping tables
1014
-     * See RFC3454 for details
1015
-     *
1016
-     * @private array
1017
-     * @since 0.5.2
1018
-     */
1019
-    protected static $NP = array
1020
-            ('map_nothing' => array(0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C
1021
-                    ,0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07
1022
-                    ,0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
1023
-                    )
1024
-            ,'general_prohibited' => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
1025
-                    ,20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 ,33, 34, 35, 36, 37, 38, 39, 40, 41, 42
1026
-                    ,43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, 127, 0x3002
1027
-                    )
1028
-            ,'prohibit' => array(0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003
1029
-                    ,0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E, 0x200F
1030
-                    ,0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x202F, 0x205F, 0x206A, 0x206B, 0x206C
1031
-                    ,0x206D, 0x206E, 0x206F, 0x3000, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF
1032
-                    ,0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE
1033
-                    ,0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF
1034
-                    ,0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xE0001, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
1035
-                    )
1036
-            ,'prohibit_ranges' => array(array(0x80, 0x9F), array(0x2060, 0x206F), array(0x1D173, 0x1D17A)
1037
-                    ,array(0xE000, 0xF8FF) ,array(0xF0000, 0xFFFFD), array(0x100000, 0x10FFFD)
1038
-                    ,array(0xFDD0, 0xFDEF), array(0xD800, 0xDFFF), array(0x2FF0, 0x2FFB), array(0xE0020, 0xE007F)
1039
-                    )
1040
-            ,'replacemaps' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63)
1041
-                    ,0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66), 0x47 => array(0x67)
1042
-                    ,0x48 => array(0x68), 0x49 => array(0x69), 0x4A => array(0x6A), 0x4B => array(0x6B)
1043
-                    ,0x4C => array(0x6C), 0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F)
1044
-                    ,0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72), 0x53 => array(0x73)
1045
-                    ,0x54 => array(0x74), 0x55 => array(0x75), 0x56 => array(0x76), 0x57 => array(0x77)
1046
-                    ,0x58 => array(0x78), 0x59 => array(0x79), 0x5A => array(0x7A), 0xB5 => array(0x3BC)
1047
-                    ,0xC0 => array(0xE0), 0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3)
1048
-                    ,0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6), 0xC7 => array(0xE7)
1049
-                    ,0xC8 => array(0xE8), 0xC9 => array(0xE9), 0xCA => array(0xEA), 0xCB => array(0xEB)
1050
-                    ,0xCC => array(0xEC), 0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF)
1051
-                    ,0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2), 0xD3 => array(0xF3)
1052
-                    ,0xD4 => array(0xF4), 0xD5 => array(0xF5), 0xD6 => array(0xF6), 0xD8 => array(0xF8)
1053
-                    ,0xD9 => array(0xF9), 0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC)
1054
-                    ,0xDD => array(0xFD), 0xDE => array(0xFE), 0xDF => array(0x73, 0x73)
1055
-                    ,0x100 => array(0x101), 0x102 => array(0x103), 0x104 => array(0x105)
1056
-                    ,0x106 => array(0x107), 0x108 => array(0x109), 0x10A => array(0x10B)
1057
-                    ,0x10C => array(0x10D), 0x10E => array(0x10F), 0x110 => array(0x111)
1058
-                    ,0x112 => array(0x113), 0x114 => array(0x115), 0x116 => array(0x117)
1059
-                    ,0x118 => array(0x119), 0x11A => array(0x11B), 0x11C => array(0x11D)
1060
-                    ,0x11E => array(0x11F), 0x120 => array(0x121), 0x122 => array(0x123)
1061
-                    ,0x124 => array(0x125), 0x126 => array(0x127), 0x128 => array(0x129)
1062
-                    ,0x12A => array(0x12B), 0x12C => array(0x12D), 0x12E => array(0x12F)
1063
-                    ,0x130 => array(0x69, 0x307), 0x132 => array(0x133), 0x134 => array(0x135)
1064
-                    ,0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C)
1065
-                    ,0x13D => array(0x13E), 0x13F => array(0x140), 0x141 => array(0x142)
1066
-                    ,0x143 => array(0x144), 0x145 => array(0x146), 0x147 => array(0x148)
1067
-                    ,0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B), 0x14C => array(0x14D)
1068
-                    ,0x14E => array(0x14F), 0x150 => array(0x151), 0x152 => array(0x153)
1069
-                    ,0x154 => array(0x155), 0x156 => array(0x157), 0x158 => array(0x159)
1070
-                    ,0x15A => array(0x15B), 0x15C => array(0x15D), 0x15E => array(0x15F)
1071
-                    ,0x160 => array(0x161), 0x162 => array(0x163), 0x164 => array(0x165)
1072
-                    ,0x166 => array(0x167), 0x168 => array(0x169), 0x16A => array(0x16B)
1073
-                    ,0x16C => array(0x16D), 0x16E => array(0x16F), 0x170 => array(0x171)
1074
-                    ,0x172 => array(0x173), 0x174 => array(0x175), 0x176 => array(0x177)
1075
-                    ,0x178 => array(0xFF), 0x179 => array(0x17A), 0x17B => array(0x17C)
1076
-                    ,0x17D => array(0x17E), 0x17F => array(0x73), 0x181 => array(0x253)
1077
-                    ,0x182 => array(0x183), 0x184 => array(0x185), 0x186 => array(0x254)
1078
-                    ,0x187 => array(0x188), 0x189 => array(0x256), 0x18A => array(0x257)
1079
-                    ,0x18B => array(0x18C), 0x18E => array(0x1DD), 0x18F => array(0x259)
1080
-                    ,0x190 => array(0x25B), 0x191 => array(0x192), 0x193 => array(0x260)
1081
-                    ,0x194 => array(0x263), 0x196 => array(0x269), 0x197 => array(0x268)
1082
-                    ,0x198 => array(0x199), 0x19C => array(0x26F), 0x19D => array(0x272)
1083
-                    ,0x19F => array(0x275), 0x1A0 => array(0x1A1), 0x1A2 => array(0x1A3)
1084
-                    ,0x1A4 => array(0x1A5), 0x1A6 => array(0x280), 0x1A7 => array(0x1A8)
1085
-                    ,0x1A9 => array(0x283), 0x1AC => array(0x1AD), 0x1AE => array(0x288)
1086
-                    ,0x1AF => array(0x1B0), 0x1B1 => array(0x28A), 0x1B2 => array(0x28B)
1087
-                    ,0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6), 0x1B7 => array(0x292)
1088
-                    ,0x1B8 => array(0x1B9), 0x1BC => array(0x1BD), 0x1C4 => array(0x1C6)
1089
-                    ,0x1C5 => array(0x1C6), 0x1C7 => array(0x1C9), 0x1C8 => array(0x1C9)
1090
-                    ,0x1CA => array(0x1CC), 0x1CB => array(0x1CC), 0x1CD => array(0x1CE)
1091
-                    ,0x1CF => array(0x1D0), 0x1D1   => array(0x1D2), 0x1D3   => array(0x1D4)
1092
-                    ,0x1D5   => array(0x1D6), 0x1D7   => array(0x1D8), 0x1D9   => array(0x1DA)
1093
-                    ,0x1DB   => array(0x1DC), 0x1DE   => array(0x1DF), 0x1E0   => array(0x1E1)
1094
-                    ,0x1E2   => array(0x1E3), 0x1E4   => array(0x1E5), 0x1E6   => array(0x1E7)
1095
-                    ,0x1E8   => array(0x1E9), 0x1EA   => array(0x1EB), 0x1EC   => array(0x1ED)
1096
-                    ,0x1EE   => array(0x1EF), 0x1F0   => array(0x6A, 0x30C), 0x1F1   => array(0x1F3)
1097
-                    ,0x1F2   => array(0x1F3), 0x1F4   => array(0x1F5), 0x1F6   => array(0x195)
1098
-                    ,0x1F7   => array(0x1BF), 0x1F8   => array(0x1F9), 0x1FA   => array(0x1FB)
1099
-                    ,0x1FC   => array(0x1FD), 0x1FE   => array(0x1FF), 0x200   => array(0x201)
1100
-                    ,0x202   => array(0x203), 0x204   => array(0x205), 0x206   => array(0x207)
1101
-                    ,0x208   => array(0x209), 0x20A   => array(0x20B), 0x20C   => array(0x20D)
1102
-                    ,0x20E   => array(0x20F), 0x210   => array(0x211), 0x212   => array(0x213)
1103
-                    ,0x214   => array(0x215), 0x216   => array(0x217), 0x218   => array(0x219)
1104
-                    ,0x21A   => array(0x21B), 0x21C   => array(0x21D), 0x21E   => array(0x21F)
1105
-                    ,0x220   => array(0x19E), 0x222   => array(0x223), 0x224   => array(0x225)
1106
-                    ,0x226   => array(0x227), 0x228   => array(0x229), 0x22A   => array(0x22B)
1107
-                    ,0x22C   => array(0x22D), 0x22E   => array(0x22F), 0x230   => array(0x231)
1108
-                    ,0x232   => array(0x233), 0x345   => array(0x3B9), 0x37A   => array(0x20, 0x3B9)
1109
-                    ,0x386   => array(0x3AC), 0x388   => array(0x3AD), 0x389   => array(0x3AE)
1110
-                    ,0x38A   => array(0x3AF), 0x38C   => array(0x3CC), 0x38E   => array(0x3CD)
1111
-                    ,0x38F   => array(0x3CE), 0x390   => array(0x3B9, 0x308, 0x301)
1112
-                    ,0x391   => array(0x3B1), 0x392   => array(0x3B2), 0x393   => array(0x3B3)
1113
-                    ,0x394   => array(0x3B4), 0x395   => array(0x3B5), 0x396   => array(0x3B6)
1114
-                    ,0x397   => array(0x3B7), 0x398   => array(0x3B8), 0x399   => array(0x3B9)
1115
-                    ,0x39A   => array(0x3BA), 0x39B   => array(0x3BB), 0x39C   => array(0x3BC)
1116
-                    ,0x39D   => array(0x3BD), 0x39E   => array(0x3BE), 0x39F   => array(0x3BF)
1117
-                    ,0x3A0   => array(0x3C0), 0x3A1   => array(0x3C1), 0x3A3   => array(0x3C3)
1118
-                    ,0x3A4   => array(0x3C4), 0x3A5   => array(0x3C5), 0x3A6   => array(0x3C6)
1119
-                    ,0x3A7   => array(0x3C7), 0x3A8   => array(0x3C8), 0x3A9   => array(0x3C9)
1120
-                    ,0x3AA   => array(0x3CA), 0x3AB   => array(0x3CB), 0x3B0   => array(0x3C5, 0x308, 0x301)
1121
-                    ,0x3C2   => array(0x3C3), 0x3D0   => array(0x3B2), 0x3D1   => array(0x3B8)
1122
-                    ,0x3D2   => array(0x3C5), 0x3D3   => array(0x3CD), 0x3D4   => array(0x3CB)
1123
-                    ,0x3D5   => array(0x3C6), 0x3D6   => array(0x3C0), 0x3D8   => array(0x3D9)
1124
-                    ,0x3DA   => array(0x3DB), 0x3DC   => array(0x3DD), 0x3DE   => array(0x3DF)
1125
-                    ,0x3E0   => array(0x3E1), 0x3E2   => array(0x3E3), 0x3E4   => array(0x3E5)
1126
-                    ,0x3E6   => array(0x3E7), 0x3E8   => array(0x3E9), 0x3EA   => array(0x3EB)
1127
-                    ,0x3EC   => array(0x3ED), 0x3EE   => array(0x3EF), 0x3F0   => array(0x3BA)
1128
-                    ,0x3F1   => array(0x3C1), 0x3F2   => array(0x3C3), 0x3F4   => array(0x3B8)
1129
-                    ,0x3F5   => array(0x3B5), 0x400   => array(0x450), 0x401   => array(0x451)
1130
-                    ,0x402   => array(0x452), 0x403   => array(0x453), 0x404   => array(0x454)
1131
-                    ,0x405   => array(0x455), 0x406   => array(0x456), 0x407   => array(0x457)
1132
-                    ,0x408   => array(0x458), 0x409   => array(0x459), 0x40A   => array(0x45A)
1133
-                    ,0x40B   => array(0x45B), 0x40C   => array(0x45C), 0x40D   => array(0x45D)
1134
-                    ,0x40E   => array(0x45E), 0x40F   => array(0x45F), 0x410   => array(0x430)
1135
-                    ,0x411   => array(0x431), 0x412   => array(0x432), 0x413   => array(0x433)
1136
-                    ,0x414   => array(0x434), 0x415   => array(0x435), 0x416   => array(0x436)
1137
-                    ,0x417   => array(0x437), 0x418   => array(0x438), 0x419   => array(0x439)
1138
-                    ,0x41A   => array(0x43A), 0x41B   => array(0x43B), 0x41C   => array(0x43C)
1139
-                    ,0x41D   => array(0x43D), 0x41E   => array(0x43E), 0x41F   => array(0x43F)
1140
-                    ,0x420   => array(0x440), 0x421   => array(0x441), 0x422   => array(0x442)
1141
-                    ,0x423   => array(0x443), 0x424   => array(0x444), 0x425   => array(0x445)
1142
-                    ,0x426   => array(0x446), 0x427   => array(0x447), 0x428   => array(0x448)
1143
-                    ,0x429   => array(0x449), 0x42A   => array(0x44A), 0x42B   => array(0x44B)
1144
-                    ,0x42C   => array(0x44C), 0x42D   => array(0x44D), 0x42E   => array(0x44E)
1145
-                    ,0x42F   => array(0x44F), 0x460   => array(0x461), 0x462   => array(0x463)
1146
-                    ,0x464   => array(0x465), 0x466   => array(0x467), 0x468   => array(0x469)
1147
-                    ,0x46A   => array(0x46B), 0x46C   => array(0x46D), 0x46E   => array(0x46F)
1148
-                    ,0x470   => array(0x471), 0x472   => array(0x473), 0x474   => array(0x475)
1149
-                    ,0x476   => array(0x477), 0x478   => array(0x479), 0x47A   => array(0x47B)
1150
-                    ,0x47C   => array(0x47D), 0x47E   => array(0x47F), 0x480   => array(0x481)
1151
-                    ,0x48A   => array(0x48B), 0x48C   => array(0x48D), 0x48E   => array(0x48F)
1152
-                    ,0x490   => array(0x491), 0x492   => array(0x493), 0x494   => array(0x495)
1153
-                    ,0x496   => array(0x497), 0x498   => array(0x499), 0x49A   => array(0x49B)
1154
-                    ,0x49C   => array(0x49D), 0x49E   => array(0x49F), 0x4A0   => array(0x4A1)
1155
-                    ,0x4A2   => array(0x4A3), 0x4A4   => array(0x4A5), 0x4A6   => array(0x4A7)
1156
-                    ,0x4A8   => array(0x4A9), 0x4AA   => array(0x4AB), 0x4AC   => array(0x4AD)
1157
-                    ,0x4AE   => array(0x4AF), 0x4B0   => array(0x4B1), 0x4B2   => array(0x4B3)
1158
-                    ,0x4B4   => array(0x4B5), 0x4B6   => array(0x4B7), 0x4B8   => array(0x4B9)
1159
-                    ,0x4BA   => array(0x4BB), 0x4BC   => array(0x4BD), 0x4BE   => array(0x4BF)
1160
-                    ,0x4C1   => array(0x4C2), 0x4C3   => array(0x4C4), 0x4C5   => array(0x4C6)
1161
-                    ,0x4C7   => array(0x4C8), 0x4C9   => array(0x4CA), 0x4CB   => array(0x4CC)
1162
-                    ,0x4CD   => array(0x4CE), 0x4D0   => array(0x4D1), 0x4D2   => array(0x4D3)
1163
-                    ,0x4D4   => array(0x4D5), 0x4D6   => array(0x4D7), 0x4D8   => array(0x4D9)
1164
-                    ,0x4DA   => array(0x4DB), 0x4DC   => array(0x4DD), 0x4DE   => array(0x4DF)
1165
-                    ,0x4E0   => array(0x4E1), 0x4E2   => array(0x4E3), 0x4E4   => array(0x4E5)
1166
-                    ,0x4E6   => array(0x4E7), 0x4E8   => array(0x4E9), 0x4EA   => array(0x4EB)
1167
-                    ,0x4EC   => array(0x4ED), 0x4EE   => array(0x4EF), 0x4F0   => array(0x4F1)
1168
-                    ,0x4F2   => array(0x4F3), 0x4F4   => array(0x4F5), 0x4F8   => array(0x4F9)
1169
-                    ,0x500   => array(0x501), 0x502   => array(0x503), 0x504   => array(0x505)
1170
-                    ,0x506   => array(0x507), 0x508   => array(0x509), 0x50A   => array(0x50B)
1171
-                    ,0x50C   => array(0x50D), 0x50E   => array(0x50F), 0x531   => array(0x561)
1172
-                    ,0x532   => array(0x562), 0x533   => array(0x563), 0x534   => array(0x564)
1173
-                    ,0x535   => array(0x565), 0x536   => array(0x566), 0x537   => array(0x567)
1174
-                    ,0x538   => array(0x568), 0x539   => array(0x569), 0x53A   => array(0x56A)
1175
-                    ,0x53B   => array(0x56B), 0x53C   => array(0x56C), 0x53D   => array(0x56D)
1176
-                    ,0x53E   => array(0x56E), 0x53F   => array(0x56F), 0x540   => array(0x570)
1177
-                    ,0x541   => array(0x571), 0x542   => array(0x572), 0x543   => array(0x573)
1178
-                    ,0x544   => array(0x574), 0x545   => array(0x575), 0x546   => array(0x576)
1179
-                    ,0x547   => array(0x577), 0x548   => array(0x578), 0x549   => array(0x579)
1180
-                    ,0x54A   => array(0x57A), 0x54B   => array(0x57B), 0x54C   => array(0x57C)
1181
-                    ,0x54D   => array(0x57D), 0x54E   => array(0x57E), 0x54F   => array(0x57F)
1182
-                    ,0x550   => array(0x580), 0x551   => array(0x581), 0x552   => array(0x582)
1183
-                    ,0x553   => array(0x583), 0x554   => array(0x584), 0x555   => array(0x585)
1184
-                    ,0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0xE33 => array(0xE4D, 0xE32)
1185
-                    ,0x1E00  => array(0x1E01), 0x1E02  => array(0x1E03), 0x1E04  => array(0x1E05)
1186
-                    ,0x1E06  => array(0x1E07), 0x1E08  => array(0x1E09), 0x1E0A  => array(0x1E0B)
1187
-                    ,0x1E0C  => array(0x1E0D), 0x1E0E  => array(0x1E0F), 0x1E10  => array(0x1E11)
1188
-                    ,0x1E12  => array(0x1E13), 0x1E14  => array(0x1E15), 0x1E16  => array(0x1E17)
1189
-                    ,0x1E18  => array(0x1E19), 0x1E1A  => array(0x1E1B), 0x1E1C  => array(0x1E1D)
1190
-                    ,0x1E1E  => array(0x1E1F), 0x1E20  => array(0x1E21), 0x1E22  => array(0x1E23)
1191
-                    ,0x1E24  => array(0x1E25), 0x1E26  => array(0x1E27), 0x1E28  => array(0x1E29)
1192
-                    ,0x1E2A  => array(0x1E2B), 0x1E2C  => array(0x1E2D), 0x1E2E  => array(0x1E2F)
1193
-                    ,0x1E30  => array(0x1E31), 0x1E32  => array(0x1E33), 0x1E34  => array(0x1E35)
1194
-                    ,0x1E36  => array(0x1E37), 0x1E38  => array(0x1E39), 0x1E3A  => array(0x1E3B)
1195
-                    ,0x1E3C  => array(0x1E3D), 0x1E3E  => array(0x1E3F), 0x1E40  => array(0x1E41)
1196
-                    ,0x1E42  => array(0x1E43), 0x1E44  => array(0x1E45), 0x1E46  => array(0x1E47)
1197
-                    ,0x1E48  => array(0x1E49), 0x1E4A  => array(0x1E4B), 0x1E4C  => array(0x1E4D)
1198
-                    ,0x1E4E  => array(0x1E4F), 0x1E50  => array(0x1E51), 0x1E52  => array(0x1E53)
1199
-                    ,0x1E54  => array(0x1E55), 0x1E56  => array(0x1E57), 0x1E58  => array(0x1E59)
1200
-                    ,0x1E5A  => array(0x1E5B), 0x1E5C  => array(0x1E5D), 0x1E5E  => array(0x1E5F)
1201
-                    ,0x1E60  => array(0x1E61), 0x1E62  => array(0x1E63), 0x1E64  => array(0x1E65)
1202
-                    ,0x1E66  => array(0x1E67), 0x1E68  => array(0x1E69), 0x1E6A  => array(0x1E6B)
1203
-                    ,0x1E6C  => array(0x1E6D), 0x1E6E  => array(0x1E6F), 0x1E70  => array(0x1E71)
1204
-                    ,0x1E72  => array(0x1E73), 0x1E74  => array(0x1E75), 0x1E76  => array(0x1E77)
1205
-                    ,0x1E78  => array(0x1E79), 0x1E7A  => array(0x1E7B), 0x1E7C  => array(0x1E7D)
1206
-                    ,0x1E7E  => array(0x1E7F), 0x1E80  => array(0x1E81), 0x1E82  => array(0x1E83)
1207
-                    ,0x1E84  => array(0x1E85), 0x1E86  => array(0x1E87), 0x1E88  => array(0x1E89)
1208
-                    ,0x1E8A  => array(0x1E8B), 0x1E8C  => array(0x1E8D), 0x1E8E  => array(0x1E8F)
1209
-                    ,0x1E90  => array(0x1E91), 0x1E92  => array(0x1E93), 0x1E94  => array(0x1E95)
1210
-                    ,0x1E96  => array(0x68, 0x331), 0x1E97  => array(0x74, 0x308), 0x1E98  => array(0x77, 0x30A)
1211
-                    ,0x1E99  => array(0x79, 0x30A), 0x1E9A  => array(0x61, 0x2BE), 0x1E9B  => array(0x1E61)
1212
-                    ,0x1EA0  => array(0x1EA1), 0x1EA2  => array(0x1EA3), 0x1EA4  => array(0x1EA5)
1213
-                    ,0x1EA6  => array(0x1EA7), 0x1EA8  => array(0x1EA9), 0x1EAA  => array(0x1EAB)
1214
-                    ,0x1EAC  => array(0x1EAD), 0x1EAE  => array(0x1EAF), 0x1EB0  => array(0x1EB1)
1215
-                    ,0x1EB2  => array(0x1EB3), 0x1EB4  => array(0x1EB5), 0x1EB6  => array(0x1EB7)
1216
-                    ,0x1EB8  => array(0x1EB9), 0x1EBA  => array(0x1EBB), 0x1EBC  => array(0x1EBD)
1217
-                    ,0x1EBE  => array(0x1EBF), 0x1EC0  => array(0x1EC1), 0x1EC2  => array(0x1EC3)
1218
-                    ,0x1EC4  => array(0x1EC5), 0x1EC6  => array(0x1EC7), 0x1EC8  => array(0x1EC9)
1219
-                    ,0x1ECA  => array(0x1ECB), 0x1ECC  => array(0x1ECD), 0x1ECE  => array(0x1ECF)
1220
-                    ,0x1ED0  => array(0x1ED1), 0x1ED2  => array(0x1ED3), 0x1ED4  => array(0x1ED5)
1221
-                    ,0x1ED6  => array(0x1ED7), 0x1ED8  => array(0x1ED9), 0x1EDA  => array(0x1EDB)
1222
-                    ,0x1EDC  => array(0x1EDD), 0x1EDE  => array(0x1EDF), 0x1EE0  => array(0x1EE1)
1223
-                    ,0x1EE2  => array(0x1EE3), 0x1EE4  => array(0x1EE5), 0x1EE6  => array(0x1EE7)
1224
-                    ,0x1EE8  => array(0x1EE9), 0x1EEA  => array(0x1EEB), 0x1EEC  => array(0x1EED)
1225
-                    ,0x1EEE  => array(0x1EEF), 0x1EF0  => array(0x1EF1), 0x1EF2  => array(0x1EF3)
1226
-                    ,0x1EF4  => array(0x1EF5), 0x1EF6  => array(0x1EF7), 0x1EF8  => array(0x1EF9)
1227
-                    ,0x1F08  => array(0x1F00), 0x1F09  => array(0x1F01), 0x1F0A  => array(0x1F02)
1228
-                    ,0x1F0B  => array(0x1F03), 0x1F0C  => array(0x1F04), 0x1F0D  => array(0x1F05)
1229
-                    ,0x1F0E  => array(0x1F06), 0x1F0F  => array(0x1F07), 0x1F18  => array(0x1F10)
1230
-                    ,0x1F19  => array(0x1F11), 0x1F1A  => array(0x1F12), 0x1F1B  => array(0x1F13)
1231
-                    ,0x1F1C  => array(0x1F14), 0x1F1D  => array(0x1F15), 0x1F28  => array(0x1F20)
1232
-                    ,0x1F29  => array(0x1F21), 0x1F2A  => array(0x1F22), 0x1F2B  => array(0x1F23)
1233
-                    ,0x1F2C  => array(0x1F24), 0x1F2D  => array(0x1F25), 0x1F2E  => array(0x1F26)
1234
-                    ,0x1F2F  => array(0x1F27), 0x1F38  => array(0x1F30), 0x1F39  => array(0x1F31)
1235
-                    ,0x1F3A  => array(0x1F32), 0x1F3B  => array(0x1F33), 0x1F3C  => array(0x1F34)
1236
-                    ,0x1F3D  => array(0x1F35), 0x1F3E  => array(0x1F36), 0x1F3F  => array(0x1F37)
1237
-                    ,0x1F48  => array(0x1F40), 0x1F49  => array(0x1F41), 0x1F4A  => array(0x1F42)
1238
-                    ,0x1F4B  => array(0x1F43), 0x1F4C  => array(0x1F44), 0x1F4D  => array(0x1F45)
1239
-                    ,0x1F50  => array(0x3C5, 0x313), 0x1F52  => array(0x3C5, 0x313, 0x300)
1240
-                    ,0x1F54  => array(0x3C5, 0x313, 0x301), 0x1F56  => array(0x3C5, 0x313, 0x342)
1241
-                    ,0x1F59  => array(0x1F51), 0x1F5B  => array(0x1F53), 0x1F5D  => array(0x1F55)
1242
-                    ,0x1F5F  => array(0x1F57), 0x1F68  => array(0x1F60), 0x1F69  => array(0x1F61)
1243
-                    ,0x1F6A  => array(0x1F62), 0x1F6B  => array(0x1F63), 0x1F6C  => array(0x1F64)
1244
-                    ,0x1F6D  => array(0x1F65), 0x1F6E  => array(0x1F66), 0x1F6F  => array(0x1F67)
1245
-                    ,0x1F80  => array(0x1F00, 0x3B9), 0x1F81  => array(0x1F01, 0x3B9)
1246
-                    ,0x1F82  => array(0x1F02, 0x3B9), 0x1F83  => array(0x1F03, 0x3B9)
1247
-                    ,0x1F84  => array(0x1F04, 0x3B9), 0x1F85  => array(0x1F05, 0x3B9)
1248
-                    ,0x1F86  => array(0x1F06, 0x3B9), 0x1F87  => array(0x1F07, 0x3B9)
1249
-                    ,0x1F88  => array(0x1F00, 0x3B9), 0x1F89  => array(0x1F01, 0x3B9)
1250
-                    ,0x1F8A  => array(0x1F02, 0x3B9), 0x1F8B  => array(0x1F03, 0x3B9)
1251
-                    ,0x1F8C  => array(0x1F04, 0x3B9), 0x1F8D  => array(0x1F05, 0x3B9)
1252
-                    ,0x1F8E  => array(0x1F06, 0x3B9), 0x1F8F  => array(0x1F07, 0x3B9)
1253
-                    ,0x1F90  => array(0x1F20, 0x3B9), 0x1F91  => array(0x1F21, 0x3B9)
1254
-                    ,0x1F92  => array(0x1F22, 0x3B9), 0x1F93  => array(0x1F23, 0x3B9)
1255
-                    ,0x1F94  => array(0x1F24, 0x3B9), 0x1F95  => array(0x1F25, 0x3B9)
1256
-                    ,0x1F96  => array(0x1F26, 0x3B9), 0x1F97  => array(0x1F27, 0x3B9)
1257
-                    ,0x1F98  => array(0x1F20, 0x3B9), 0x1F99  => array(0x1F21, 0x3B9)
1258
-                    ,0x1F9A  => array(0x1F22, 0x3B9), 0x1F9B  => array(0x1F23, 0x3B9)
1259
-                    ,0x1F9C  => array(0x1F24, 0x3B9), 0x1F9D  => array(0x1F25, 0x3B9)
1260
-                    ,0x1F9E  => array(0x1F26, 0x3B9), 0x1F9F  => array(0x1F27, 0x3B9)
1261
-                    ,0x1FA0  => array(0x1F60, 0x3B9), 0x1FA1  => array(0x1F61, 0x3B9)
1262
-                    ,0x1FA2  => array(0x1F62, 0x3B9), 0x1FA3  => array(0x1F63, 0x3B9)
1263
-                    ,0x1FA4  => array(0x1F64, 0x3B9), 0x1FA5  => array(0x1F65, 0x3B9)
1264
-                    ,0x1FA6  => array(0x1F66, 0x3B9), 0x1FA7  => array(0x1F67, 0x3B9)
1265
-                    ,0x1FA8  => array(0x1F60, 0x3B9), 0x1FA9  => array(0x1F61, 0x3B9)
1266
-                    ,0x1FAA  => array(0x1F62, 0x3B9), 0x1FAB  => array(0x1F63, 0x3B9)
1267
-                    ,0x1FAC  => array(0x1F64, 0x3B9), 0x1FAD  => array(0x1F65, 0x3B9)
1268
-                    ,0x1FAE  => array(0x1F66, 0x3B9), 0x1FAF  => array(0x1F67, 0x3B9)
1269
-                    ,0x1FB2  => array(0x1F70, 0x3B9), 0x1FB3  => array(0x3B1, 0x3B9)
1270
-                    ,0x1FB4  => array(0x3AC, 0x3B9), 0x1FB6  => array(0x3B1, 0x342)
1271
-                    ,0x1FB7  => array(0x3B1, 0x342, 0x3B9), 0x1FB8  => array(0x1FB0)
1272
-                    ,0x1FB9  => array(0x1FB1), 0x1FBA  => array(0x1F70), 0x1FBB  => array(0x1F71)
1273
-                    ,0x1FBC  => array(0x3B1, 0x3B9), 0x1FBE  => array(0x3B9)
1274
-                    ,0x1FC2  => array(0x1F74, 0x3B9), 0x1FC3  => array(0x3B7, 0x3B9)
1275
-                    ,0x1FC4  => array(0x3AE, 0x3B9), 0x1FC6  => array(0x3B7, 0x342)
1276
-                    ,0x1FC7  => array(0x3B7, 0x342, 0x3B9), 0x1FC8  => array(0x1F72)
1277
-                    ,0x1FC9  => array(0x1F73), 0x1FCA  => array(0x1F74), 0x1FCB  => array(0x1F75)
1278
-                    ,0x1FCC  => array(0x3B7, 0x3B9), 0x1FD2  => array(0x3B9, 0x308, 0x300)
1279
-                    ,0x1FD3  => array(0x3B9, 0x308, 0x301), 0x1FD6  => array(0x3B9, 0x342)
1280
-                    ,0x1FD7  => array(0x3B9, 0x308, 0x342), 0x1FD8  => array(0x1FD0)
1281
-                    ,0x1FD9  => array(0x1FD1), 0x1FDA  => array(0x1F76)
1282
-                    ,0x1FDB  => array(0x1F77), 0x1FE2  => array(0x3C5, 0x308, 0x300)
1283
-                    ,0x1FE3  => array(0x3C5, 0x308, 0x301), 0x1FE4  => array(0x3C1, 0x313)
1284
-                    ,0x1FE6  => array(0x3C5, 0x342), 0x1FE7  => array(0x3C5, 0x308, 0x342)
1285
-                    ,0x1FE8  => array(0x1FE0), 0x1FE9  => array(0x1FE1)
1286
-                    ,0x1FEA  => array(0x1F7A), 0x1FEB  => array(0x1F7B)
1287
-                    ,0x1FEC  => array(0x1FE5), 0x1FF2  => array(0x1F7C, 0x3B9)
1288
-                    ,0x1FF3  => array(0x3C9, 0x3B9), 0x1FF4  => array(0x3CE, 0x3B9)
1289
-                    ,0x1FF6  => array(0x3C9, 0x342), 0x1FF7  => array(0x3C9, 0x342, 0x3B9)
1290
-                    ,0x1FF8  => array(0x1F78), 0x1FF9  => array(0x1F79), 0x1FFA  => array(0x1F7C)
1291
-                    ,0x1FFB  => array(0x1F7D), 0x1FFC  => array(0x3C9, 0x3B9)
1292
-                    ,0x20A8  => array(0x72, 0x73), 0x2102  => array(0x63), 0x2103  => array(0xB0, 0x63)
1293
-                    ,0x2107  => array(0x25B), 0x2109  => array(0xB0, 0x66), 0x210B  => array(0x68)
1294
-                    ,0x210C  => array(0x68), 0x210D  => array(0x68), 0x2110  => array(0x69)
1295
-                    ,0x2111  => array(0x69), 0x2112  => array(0x6C), 0x2115  => array(0x6E)
1296
-                    ,0x2116  => array(0x6E, 0x6F), 0x2119  => array(0x70), 0x211A  => array(0x71)
1297
-                    ,0x211B  => array(0x72), 0x211C  => array(0x72), 0x211D  => array(0x72)
1298
-                    ,0x2120  => array(0x73, 0x6D), 0x2121  => array(0x74, 0x65, 0x6C)
1299
-                    ,0x2122  => array(0x74, 0x6D), 0x2124  => array(0x7A), 0x2126  => array(0x3C9)
1300
-                    ,0x2128  => array(0x7A), 0x212A  => array(0x6B), 0x212B  => array(0xE5)
1301
-                    ,0x212C  => array(0x62), 0x212D  => array(0x63), 0x2130  => array(0x65)
1302
-                    ,0x2131  => array(0x66), 0x2133  => array(0x6D), 0x213E  => array(0x3B3)
1303
-                    ,0x213F  => array(0x3C0), 0x2145  => array(0x64) ,0x2160  => array(0x2170)
1304
-                    ,0x2161  => array(0x2171), 0x2162  => array(0x2172), 0x2163  => array(0x2173)
1305
-                    ,0x2164  => array(0x2174), 0x2165  => array(0x2175), 0x2166  => array(0x2176)
1306
-                    ,0x2167  => array(0x2177), 0x2168  => array(0x2178), 0x2169  => array(0x2179)
1307
-                    ,0x216A  => array(0x217A), 0x216B  => array(0x217B), 0x216C  => array(0x217C)
1308
-                    ,0x216D  => array(0x217D), 0x216E  => array(0x217E), 0x216F  => array(0x217F)
1309
-                    ,0x24B6  => array(0x24D0), 0x24B7  => array(0x24D1), 0x24B8  => array(0x24D2)
1310
-                    ,0x24B9  => array(0x24D3), 0x24BA  => array(0x24D4), 0x24BB  => array(0x24D5)
1311
-                    ,0x24BC  => array(0x24D6), 0x24BD  => array(0x24D7), 0x24BE  => array(0x24D8)
1312
-                    ,0x24BF  => array(0x24D9), 0x24C0  => array(0x24DA), 0x24C1  => array(0x24DB)
1313
-                    ,0x24C2  => array(0x24DC), 0x24C3  => array(0x24DD), 0x24C4  => array(0x24DE)
1314
-                    ,0x24C5  => array(0x24DF), 0x24C6  => array(0x24E0), 0x24C7  => array(0x24E1)
1315
-                    ,0x24C8  => array(0x24E2), 0x24C9  => array(0x24E3), 0x24CA  => array(0x24E4)
1316
-                    ,0x24CB  => array(0x24E5), 0x24CC  => array(0x24E6), 0x24CD  => array(0x24E7)
1317
-                    ,0x24CE  => array(0x24E8), 0x24CF  => array(0x24E9), 0x3371  => array(0x68, 0x70, 0x61)
1318
-                    ,0x3373  => array(0x61, 0x75), 0x3375  => array(0x6F, 0x76)
1319
-                    ,0x3380  => array(0x70, 0x61), 0x3381  => array(0x6E, 0x61)
1320
-                    ,0x3382  => array(0x3BC, 0x61), 0x3383  => array(0x6D, 0x61)
1321
-                    ,0x3384  => array(0x6B, 0x61), 0x3385  => array(0x6B, 0x62)
1322
-                    ,0x3386  => array(0x6D, 0x62), 0x3387  => array(0x67, 0x62)
1323
-                    ,0x338A  => array(0x70, 0x66), 0x338B  => array(0x6E, 0x66)
1324
-                    ,0x338C  => array(0x3BC, 0x66), 0x3390  => array(0x68, 0x7A)
1325
-                    ,0x3391  => array(0x6B, 0x68, 0x7A), 0x3392  => array(0x6D, 0x68, 0x7A)
1326
-                    ,0x3393  => array(0x67, 0x68, 0x7A), 0x3394  => array(0x74, 0x68, 0x7A)
1327
-                    ,0x33A9  => array(0x70, 0x61), 0x33AA  => array(0x6B, 0x70, 0x61)
1328
-                    ,0x33AB  => array(0x6D, 0x70, 0x61), 0x33AC  => array(0x67, 0x70, 0x61)
1329
-                    ,0x33B4  => array(0x70, 0x76), 0x33B5  => array(0x6E, 0x76)
1330
-                    ,0x33B6  => array(0x3BC, 0x76), 0x33B7  => array(0x6D, 0x76)
1331
-                    ,0x33B8  => array(0x6B, 0x76), 0x33B9  => array(0x6D, 0x76)
1332
-                    ,0x33BA  => array(0x70, 0x77), 0x33BB  => array(0x6E, 0x77)
1333
-                    ,0x33BC  => array(0x3BC, 0x77), 0x33BD  => array(0x6D, 0x77)
1334
-                    ,0x33BE  => array(0x6B, 0x77), 0x33BF  => array(0x6D, 0x77)
1335
-                    ,0x33C0  => array(0x6B, 0x3C9), 0x33C1  => array(0x6D, 0x3C9) /*
1012
+	/**
1013
+	 * Holds all relevant mapping tables
1014
+	 * See RFC3454 for details
1015
+	 *
1016
+	 * @private array
1017
+	 * @since 0.5.2
1018
+	 */
1019
+	protected static $NP = array
1020
+			('map_nothing' => array(0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C
1021
+					,0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07
1022
+					,0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
1023
+					)
1024
+			,'general_prohibited' => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
1025
+					,20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 ,33, 34, 35, 36, 37, 38, 39, 40, 41, 42
1026
+					,43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, 127, 0x3002
1027
+					)
1028
+			,'prohibit' => array(0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003
1029
+					,0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E, 0x200F
1030
+					,0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x202F, 0x205F, 0x206A, 0x206B, 0x206C
1031
+					,0x206D, 0x206E, 0x206F, 0x3000, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF
1032
+					,0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE
1033
+					,0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF
1034
+					,0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xE0001, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
1035
+					)
1036
+			,'prohibit_ranges' => array(array(0x80, 0x9F), array(0x2060, 0x206F), array(0x1D173, 0x1D17A)
1037
+					,array(0xE000, 0xF8FF) ,array(0xF0000, 0xFFFFD), array(0x100000, 0x10FFFD)
1038
+					,array(0xFDD0, 0xFDEF), array(0xD800, 0xDFFF), array(0x2FF0, 0x2FFB), array(0xE0020, 0xE007F)
1039
+					)
1040
+			,'replacemaps' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63)
1041
+					,0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66), 0x47 => array(0x67)
1042
+					,0x48 => array(0x68), 0x49 => array(0x69), 0x4A => array(0x6A), 0x4B => array(0x6B)
1043
+					,0x4C => array(0x6C), 0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F)
1044
+					,0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72), 0x53 => array(0x73)
1045
+					,0x54 => array(0x74), 0x55 => array(0x75), 0x56 => array(0x76), 0x57 => array(0x77)
1046
+					,0x58 => array(0x78), 0x59 => array(0x79), 0x5A => array(0x7A), 0xB5 => array(0x3BC)
1047
+					,0xC0 => array(0xE0), 0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3)
1048
+					,0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6), 0xC7 => array(0xE7)
1049
+					,0xC8 => array(0xE8), 0xC9 => array(0xE9), 0xCA => array(0xEA), 0xCB => array(0xEB)
1050
+					,0xCC => array(0xEC), 0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF)
1051
+					,0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2), 0xD3 => array(0xF3)
1052
+					,0xD4 => array(0xF4), 0xD5 => array(0xF5), 0xD6 => array(0xF6), 0xD8 => array(0xF8)
1053
+					,0xD9 => array(0xF9), 0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC)
1054
+					,0xDD => array(0xFD), 0xDE => array(0xFE), 0xDF => array(0x73, 0x73)
1055
+					,0x100 => array(0x101), 0x102 => array(0x103), 0x104 => array(0x105)
1056
+					,0x106 => array(0x107), 0x108 => array(0x109), 0x10A => array(0x10B)
1057
+					,0x10C => array(0x10D), 0x10E => array(0x10F), 0x110 => array(0x111)
1058
+					,0x112 => array(0x113), 0x114 => array(0x115), 0x116 => array(0x117)
1059
+					,0x118 => array(0x119), 0x11A => array(0x11B), 0x11C => array(0x11D)
1060
+					,0x11E => array(0x11F), 0x120 => array(0x121), 0x122 => array(0x123)
1061
+					,0x124 => array(0x125), 0x126 => array(0x127), 0x128 => array(0x129)
1062
+					,0x12A => array(0x12B), 0x12C => array(0x12D), 0x12E => array(0x12F)
1063
+					,0x130 => array(0x69, 0x307), 0x132 => array(0x133), 0x134 => array(0x135)
1064
+					,0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C)
1065
+					,0x13D => array(0x13E), 0x13F => array(0x140), 0x141 => array(0x142)
1066
+					,0x143 => array(0x144), 0x145 => array(0x146), 0x147 => array(0x148)
1067
+					,0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B), 0x14C => array(0x14D)
1068
+					,0x14E => array(0x14F), 0x150 => array(0x151), 0x152 => array(0x153)
1069
+					,0x154 => array(0x155), 0x156 => array(0x157), 0x158 => array(0x159)
1070
+					,0x15A => array(0x15B), 0x15C => array(0x15D), 0x15E => array(0x15F)
1071
+					,0x160 => array(0x161), 0x162 => array(0x163), 0x164 => array(0x165)
1072
+					,0x166 => array(0x167), 0x168 => array(0x169), 0x16A => array(0x16B)
1073
+					,0x16C => array(0x16D), 0x16E => array(0x16F), 0x170 => array(0x171)
1074
+					,0x172 => array(0x173), 0x174 => array(0x175), 0x176 => array(0x177)
1075
+					,0x178 => array(0xFF), 0x179 => array(0x17A), 0x17B => array(0x17C)
1076
+					,0x17D => array(0x17E), 0x17F => array(0x73), 0x181 => array(0x253)
1077
+					,0x182 => array(0x183), 0x184 => array(0x185), 0x186 => array(0x254)
1078
+					,0x187 => array(0x188), 0x189 => array(0x256), 0x18A => array(0x257)
1079
+					,0x18B => array(0x18C), 0x18E => array(0x1DD), 0x18F => array(0x259)
1080
+					,0x190 => array(0x25B), 0x191 => array(0x192), 0x193 => array(0x260)
1081
+					,0x194 => array(0x263), 0x196 => array(0x269), 0x197 => array(0x268)
1082
+					,0x198 => array(0x199), 0x19C => array(0x26F), 0x19D => array(0x272)
1083
+					,0x19F => array(0x275), 0x1A0 => array(0x1A1), 0x1A2 => array(0x1A3)
1084
+					,0x1A4 => array(0x1A5), 0x1A6 => array(0x280), 0x1A7 => array(0x1A8)
1085
+					,0x1A9 => array(0x283), 0x1AC => array(0x1AD), 0x1AE => array(0x288)
1086
+					,0x1AF => array(0x1B0), 0x1B1 => array(0x28A), 0x1B2 => array(0x28B)
1087
+					,0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6), 0x1B7 => array(0x292)
1088
+					,0x1B8 => array(0x1B9), 0x1BC => array(0x1BD), 0x1C4 => array(0x1C6)
1089
+					,0x1C5 => array(0x1C6), 0x1C7 => array(0x1C9), 0x1C8 => array(0x1C9)
1090
+					,0x1CA => array(0x1CC), 0x1CB => array(0x1CC), 0x1CD => array(0x1CE)
1091
+					,0x1CF => array(0x1D0), 0x1D1   => array(0x1D2), 0x1D3   => array(0x1D4)
1092
+					,0x1D5   => array(0x1D6), 0x1D7   => array(0x1D8), 0x1D9   => array(0x1DA)
1093
+					,0x1DB   => array(0x1DC), 0x1DE   => array(0x1DF), 0x1E0   => array(0x1E1)
1094
+					,0x1E2   => array(0x1E3), 0x1E4   => array(0x1E5), 0x1E6   => array(0x1E7)
1095
+					,0x1E8   => array(0x1E9), 0x1EA   => array(0x1EB), 0x1EC   => array(0x1ED)
1096
+					,0x1EE   => array(0x1EF), 0x1F0   => array(0x6A, 0x30C), 0x1F1   => array(0x1F3)
1097
+					,0x1F2   => array(0x1F3), 0x1F4   => array(0x1F5), 0x1F6   => array(0x195)
1098
+					,0x1F7   => array(0x1BF), 0x1F8   => array(0x1F9), 0x1FA   => array(0x1FB)
1099
+					,0x1FC   => array(0x1FD), 0x1FE   => array(0x1FF), 0x200   => array(0x201)
1100
+					,0x202   => array(0x203), 0x204   => array(0x205), 0x206   => array(0x207)
1101
+					,0x208   => array(0x209), 0x20A   => array(0x20B), 0x20C   => array(0x20D)
1102
+					,0x20E   => array(0x20F), 0x210   => array(0x211), 0x212   => array(0x213)
1103
+					,0x214   => array(0x215), 0x216   => array(0x217), 0x218   => array(0x219)
1104
+					,0x21A   => array(0x21B), 0x21C   => array(0x21D), 0x21E   => array(0x21F)
1105
+					,0x220   => array(0x19E), 0x222   => array(0x223), 0x224   => array(0x225)
1106
+					,0x226   => array(0x227), 0x228   => array(0x229), 0x22A   => array(0x22B)
1107
+					,0x22C   => array(0x22D), 0x22E   => array(0x22F), 0x230   => array(0x231)
1108
+					,0x232   => array(0x233), 0x345   => array(0x3B9), 0x37A   => array(0x20, 0x3B9)
1109
+					,0x386   => array(0x3AC), 0x388   => array(0x3AD), 0x389   => array(0x3AE)
1110
+					,0x38A   => array(0x3AF), 0x38C   => array(0x3CC), 0x38E   => array(0x3CD)
1111
+					,0x38F   => array(0x3CE), 0x390   => array(0x3B9, 0x308, 0x301)
1112
+					,0x391   => array(0x3B1), 0x392   => array(0x3B2), 0x393   => array(0x3B3)
1113
+					,0x394   => array(0x3B4), 0x395   => array(0x3B5), 0x396   => array(0x3B6)
1114
+					,0x397   => array(0x3B7), 0x398   => array(0x3B8), 0x399   => array(0x3B9)
1115
+					,0x39A   => array(0x3BA), 0x39B   => array(0x3BB), 0x39C   => array(0x3BC)
1116
+					,0x39D   => array(0x3BD), 0x39E   => array(0x3BE), 0x39F   => array(0x3BF)
1117
+					,0x3A0   => array(0x3C0), 0x3A1   => array(0x3C1), 0x3A3   => array(0x3C3)
1118
+					,0x3A4   => array(0x3C4), 0x3A5   => array(0x3C5), 0x3A6   => array(0x3C6)
1119
+					,0x3A7   => array(0x3C7), 0x3A8   => array(0x3C8), 0x3A9   => array(0x3C9)
1120
+					,0x3AA   => array(0x3CA), 0x3AB   => array(0x3CB), 0x3B0   => array(0x3C5, 0x308, 0x301)
1121
+					,0x3C2   => array(0x3C3), 0x3D0   => array(0x3B2), 0x3D1   => array(0x3B8)
1122
+					,0x3D2   => array(0x3C5), 0x3D3   => array(0x3CD), 0x3D4   => array(0x3CB)
1123
+					,0x3D5   => array(0x3C6), 0x3D6   => array(0x3C0), 0x3D8   => array(0x3D9)
1124
+					,0x3DA   => array(0x3DB), 0x3DC   => array(0x3DD), 0x3DE   => array(0x3DF)
1125
+					,0x3E0   => array(0x3E1), 0x3E2   => array(0x3E3), 0x3E4   => array(0x3E5)
1126
+					,0x3E6   => array(0x3E7), 0x3E8   => array(0x3E9), 0x3EA   => array(0x3EB)
1127
+					,0x3EC   => array(0x3ED), 0x3EE   => array(0x3EF), 0x3F0   => array(0x3BA)
1128
+					,0x3F1   => array(0x3C1), 0x3F2   => array(0x3C3), 0x3F4   => array(0x3B8)
1129
+					,0x3F5   => array(0x3B5), 0x400   => array(0x450), 0x401   => array(0x451)
1130
+					,0x402   => array(0x452), 0x403   => array(0x453), 0x404   => array(0x454)
1131
+					,0x405   => array(0x455), 0x406   => array(0x456), 0x407   => array(0x457)
1132
+					,0x408   => array(0x458), 0x409   => array(0x459), 0x40A   => array(0x45A)
1133
+					,0x40B   => array(0x45B), 0x40C   => array(0x45C), 0x40D   => array(0x45D)
1134
+					,0x40E   => array(0x45E), 0x40F   => array(0x45F), 0x410   => array(0x430)
1135
+					,0x411   => array(0x431), 0x412   => array(0x432), 0x413   => array(0x433)
1136
+					,0x414   => array(0x434), 0x415   => array(0x435), 0x416   => array(0x436)
1137
+					,0x417   => array(0x437), 0x418   => array(0x438), 0x419   => array(0x439)
1138
+					,0x41A   => array(0x43A), 0x41B   => array(0x43B), 0x41C   => array(0x43C)
1139
+					,0x41D   => array(0x43D), 0x41E   => array(0x43E), 0x41F   => array(0x43F)
1140
+					,0x420   => array(0x440), 0x421   => array(0x441), 0x422   => array(0x442)
1141
+					,0x423   => array(0x443), 0x424   => array(0x444), 0x425   => array(0x445)
1142
+					,0x426   => array(0x446), 0x427   => array(0x447), 0x428   => array(0x448)
1143
+					,0x429   => array(0x449), 0x42A   => array(0x44A), 0x42B   => array(0x44B)
1144
+					,0x42C   => array(0x44C), 0x42D   => array(0x44D), 0x42E   => array(0x44E)
1145
+					,0x42F   => array(0x44F), 0x460   => array(0x461), 0x462   => array(0x463)
1146
+					,0x464   => array(0x465), 0x466   => array(0x467), 0x468   => array(0x469)
1147
+					,0x46A   => array(0x46B), 0x46C   => array(0x46D), 0x46E   => array(0x46F)
1148
+					,0x470   => array(0x471), 0x472   => array(0x473), 0x474   => array(0x475)
1149
+					,0x476   => array(0x477), 0x478   => array(0x479), 0x47A   => array(0x47B)
1150
+					,0x47C   => array(0x47D), 0x47E   => array(0x47F), 0x480   => array(0x481)
1151
+					,0x48A   => array(0x48B), 0x48C   => array(0x48D), 0x48E   => array(0x48F)
1152
+					,0x490   => array(0x491), 0x492   => array(0x493), 0x494   => array(0x495)
1153
+					,0x496   => array(0x497), 0x498   => array(0x499), 0x49A   => array(0x49B)
1154
+					,0x49C   => array(0x49D), 0x49E   => array(0x49F), 0x4A0   => array(0x4A1)
1155
+					,0x4A2   => array(0x4A3), 0x4A4   => array(0x4A5), 0x4A6   => array(0x4A7)
1156
+					,0x4A8   => array(0x4A9), 0x4AA   => array(0x4AB), 0x4AC   => array(0x4AD)
1157
+					,0x4AE   => array(0x4AF), 0x4B0   => array(0x4B1), 0x4B2   => array(0x4B3)
1158
+					,0x4B4   => array(0x4B5), 0x4B6   => array(0x4B7), 0x4B8   => array(0x4B9)
1159
+					,0x4BA   => array(0x4BB), 0x4BC   => array(0x4BD), 0x4BE   => array(0x4BF)
1160
+					,0x4C1   => array(0x4C2), 0x4C3   => array(0x4C4), 0x4C5   => array(0x4C6)
1161
+					,0x4C7   => array(0x4C8), 0x4C9   => array(0x4CA), 0x4CB   => array(0x4CC)
1162
+					,0x4CD   => array(0x4CE), 0x4D0   => array(0x4D1), 0x4D2   => array(0x4D3)
1163
+					,0x4D4   => array(0x4D5), 0x4D6   => array(0x4D7), 0x4D8   => array(0x4D9)
1164
+					,0x4DA   => array(0x4DB), 0x4DC   => array(0x4DD), 0x4DE   => array(0x4DF)
1165
+					,0x4E0   => array(0x4E1), 0x4E2   => array(0x4E3), 0x4E4   => array(0x4E5)
1166
+					,0x4E6   => array(0x4E7), 0x4E8   => array(0x4E9), 0x4EA   => array(0x4EB)
1167
+					,0x4EC   => array(0x4ED), 0x4EE   => array(0x4EF), 0x4F0   => array(0x4F1)
1168
+					,0x4F2   => array(0x4F3), 0x4F4   => array(0x4F5), 0x4F8   => array(0x4F9)
1169
+					,0x500   => array(0x501), 0x502   => array(0x503), 0x504   => array(0x505)
1170
+					,0x506   => array(0x507), 0x508   => array(0x509), 0x50A   => array(0x50B)
1171
+					,0x50C   => array(0x50D), 0x50E   => array(0x50F), 0x531   => array(0x561)
1172
+					,0x532   => array(0x562), 0x533   => array(0x563), 0x534   => array(0x564)
1173
+					,0x535   => array(0x565), 0x536   => array(0x566), 0x537   => array(0x567)
1174
+					,0x538   => array(0x568), 0x539   => array(0x569), 0x53A   => array(0x56A)
1175
+					,0x53B   => array(0x56B), 0x53C   => array(0x56C), 0x53D   => array(0x56D)
1176
+					,0x53E   => array(0x56E), 0x53F   => array(0x56F), 0x540   => array(0x570)
1177
+					,0x541   => array(0x571), 0x542   => array(0x572), 0x543   => array(0x573)
1178
+					,0x544   => array(0x574), 0x545   => array(0x575), 0x546   => array(0x576)
1179
+					,0x547   => array(0x577), 0x548   => array(0x578), 0x549   => array(0x579)
1180
+					,0x54A   => array(0x57A), 0x54B   => array(0x57B), 0x54C   => array(0x57C)
1181
+					,0x54D   => array(0x57D), 0x54E   => array(0x57E), 0x54F   => array(0x57F)
1182
+					,0x550   => array(0x580), 0x551   => array(0x581), 0x552   => array(0x582)
1183
+					,0x553   => array(0x583), 0x554   => array(0x584), 0x555   => array(0x585)
1184
+					,0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0xE33 => array(0xE4D, 0xE32)
1185
+					,0x1E00  => array(0x1E01), 0x1E02  => array(0x1E03), 0x1E04  => array(0x1E05)
1186
+					,0x1E06  => array(0x1E07), 0x1E08  => array(0x1E09), 0x1E0A  => array(0x1E0B)
1187
+					,0x1E0C  => array(0x1E0D), 0x1E0E  => array(0x1E0F), 0x1E10  => array(0x1E11)
1188
+					,0x1E12  => array(0x1E13), 0x1E14  => array(0x1E15), 0x1E16  => array(0x1E17)
1189
+					,0x1E18  => array(0x1E19), 0x1E1A  => array(0x1E1B), 0x1E1C  => array(0x1E1D)
1190
+					,0x1E1E  => array(0x1E1F), 0x1E20  => array(0x1E21), 0x1E22  => array(0x1E23)
1191
+					,0x1E24  => array(0x1E25), 0x1E26  => array(0x1E27), 0x1E28  => array(0x1E29)
1192
+					,0x1E2A  => array(0x1E2B), 0x1E2C  => array(0x1E2D), 0x1E2E  => array(0x1E2F)
1193
+					,0x1E30  => array(0x1E31), 0x1E32  => array(0x1E33), 0x1E34  => array(0x1E35)
1194
+					,0x1E36  => array(0x1E37), 0x1E38  => array(0x1E39), 0x1E3A  => array(0x1E3B)
1195
+					,0x1E3C  => array(0x1E3D), 0x1E3E  => array(0x1E3F), 0x1E40  => array(0x1E41)
1196
+					,0x1E42  => array(0x1E43), 0x1E44  => array(0x1E45), 0x1E46  => array(0x1E47)
1197
+					,0x1E48  => array(0x1E49), 0x1E4A  => array(0x1E4B), 0x1E4C  => array(0x1E4D)
1198
+					,0x1E4E  => array(0x1E4F), 0x1E50  => array(0x1E51), 0x1E52  => array(0x1E53)
1199
+					,0x1E54  => array(0x1E55), 0x1E56  => array(0x1E57), 0x1E58  => array(0x1E59)
1200
+					,0x1E5A  => array(0x1E5B), 0x1E5C  => array(0x1E5D), 0x1E5E  => array(0x1E5F)
1201
+					,0x1E60  => array(0x1E61), 0x1E62  => array(0x1E63), 0x1E64  => array(0x1E65)
1202
+					,0x1E66  => array(0x1E67), 0x1E68  => array(0x1E69), 0x1E6A  => array(0x1E6B)
1203
+					,0x1E6C  => array(0x1E6D), 0x1E6E  => array(0x1E6F), 0x1E70  => array(0x1E71)
1204
+					,0x1E72  => array(0x1E73), 0x1E74  => array(0x1E75), 0x1E76  => array(0x1E77)
1205
+					,0x1E78  => array(0x1E79), 0x1E7A  => array(0x1E7B), 0x1E7C  => array(0x1E7D)
1206
+					,0x1E7E  => array(0x1E7F), 0x1E80  => array(0x1E81), 0x1E82  => array(0x1E83)
1207
+					,0x1E84  => array(0x1E85), 0x1E86  => array(0x1E87), 0x1E88  => array(0x1E89)
1208
+					,0x1E8A  => array(0x1E8B), 0x1E8C  => array(0x1E8D), 0x1E8E  => array(0x1E8F)
1209
+					,0x1E90  => array(0x1E91), 0x1E92  => array(0x1E93), 0x1E94  => array(0x1E95)
1210
+					,0x1E96  => array(0x68, 0x331), 0x1E97  => array(0x74, 0x308), 0x1E98  => array(0x77, 0x30A)
1211
+					,0x1E99  => array(0x79, 0x30A), 0x1E9A  => array(0x61, 0x2BE), 0x1E9B  => array(0x1E61)
1212
+					,0x1EA0  => array(0x1EA1), 0x1EA2  => array(0x1EA3), 0x1EA4  => array(0x1EA5)
1213
+					,0x1EA6  => array(0x1EA7), 0x1EA8  => array(0x1EA9), 0x1EAA  => array(0x1EAB)
1214
+					,0x1EAC  => array(0x1EAD), 0x1EAE  => array(0x1EAF), 0x1EB0  => array(0x1EB1)
1215
+					,0x1EB2  => array(0x1EB3), 0x1EB4  => array(0x1EB5), 0x1EB6  => array(0x1EB7)
1216
+					,0x1EB8  => array(0x1EB9), 0x1EBA  => array(0x1EBB), 0x1EBC  => array(0x1EBD)
1217
+					,0x1EBE  => array(0x1EBF), 0x1EC0  => array(0x1EC1), 0x1EC2  => array(0x1EC3)
1218
+					,0x1EC4  => array(0x1EC5), 0x1EC6  => array(0x1EC7), 0x1EC8  => array(0x1EC9)
1219
+					,0x1ECA  => array(0x1ECB), 0x1ECC  => array(0x1ECD), 0x1ECE  => array(0x1ECF)
1220
+					,0x1ED0  => array(0x1ED1), 0x1ED2  => array(0x1ED3), 0x1ED4  => array(0x1ED5)
1221
+					,0x1ED6  => array(0x1ED7), 0x1ED8  => array(0x1ED9), 0x1EDA  => array(0x1EDB)
1222
+					,0x1EDC  => array(0x1EDD), 0x1EDE  => array(0x1EDF), 0x1EE0  => array(0x1EE1)
1223
+					,0x1EE2  => array(0x1EE3), 0x1EE4  => array(0x1EE5), 0x1EE6  => array(0x1EE7)
1224
+					,0x1EE8  => array(0x1EE9), 0x1EEA  => array(0x1EEB), 0x1EEC  => array(0x1EED)
1225
+					,0x1EEE  => array(0x1EEF), 0x1EF0  => array(0x1EF1), 0x1EF2  => array(0x1EF3)
1226
+					,0x1EF4  => array(0x1EF5), 0x1EF6  => array(0x1EF7), 0x1EF8  => array(0x1EF9)
1227
+					,0x1F08  => array(0x1F00), 0x1F09  => array(0x1F01), 0x1F0A  => array(0x1F02)
1228
+					,0x1F0B  => array(0x1F03), 0x1F0C  => array(0x1F04), 0x1F0D  => array(0x1F05)
1229
+					,0x1F0E  => array(0x1F06), 0x1F0F  => array(0x1F07), 0x1F18  => array(0x1F10)
1230
+					,0x1F19  => array(0x1F11), 0x1F1A  => array(0x1F12), 0x1F1B  => array(0x1F13)
1231
+					,0x1F1C  => array(0x1F14), 0x1F1D  => array(0x1F15), 0x1F28  => array(0x1F20)
1232
+					,0x1F29  => array(0x1F21), 0x1F2A  => array(0x1F22), 0x1F2B  => array(0x1F23)
1233
+					,0x1F2C  => array(0x1F24), 0x1F2D  => array(0x1F25), 0x1F2E  => array(0x1F26)
1234
+					,0x1F2F  => array(0x1F27), 0x1F38  => array(0x1F30), 0x1F39  => array(0x1F31)
1235
+					,0x1F3A  => array(0x1F32), 0x1F3B  => array(0x1F33), 0x1F3C  => array(0x1F34)
1236
+					,0x1F3D  => array(0x1F35), 0x1F3E  => array(0x1F36), 0x1F3F  => array(0x1F37)
1237
+					,0x1F48  => array(0x1F40), 0x1F49  => array(0x1F41), 0x1F4A  => array(0x1F42)
1238
+					,0x1F4B  => array(0x1F43), 0x1F4C  => array(0x1F44), 0x1F4D  => array(0x1F45)
1239
+					,0x1F50  => array(0x3C5, 0x313), 0x1F52  => array(0x3C5, 0x313, 0x300)
1240
+					,0x1F54  => array(0x3C5, 0x313, 0x301), 0x1F56  => array(0x3C5, 0x313, 0x342)
1241
+					,0x1F59  => array(0x1F51), 0x1F5B  => array(0x1F53), 0x1F5D  => array(0x1F55)
1242
+					,0x1F5F  => array(0x1F57), 0x1F68  => array(0x1F60), 0x1F69  => array(0x1F61)
1243
+					,0x1F6A  => array(0x1F62), 0x1F6B  => array(0x1F63), 0x1F6C  => array(0x1F64)
1244
+					,0x1F6D  => array(0x1F65), 0x1F6E  => array(0x1F66), 0x1F6F  => array(0x1F67)
1245
+					,0x1F80  => array(0x1F00, 0x3B9), 0x1F81  => array(0x1F01, 0x3B9)
1246
+					,0x1F82  => array(0x1F02, 0x3B9), 0x1F83  => array(0x1F03, 0x3B9)
1247
+					,0x1F84  => array(0x1F04, 0x3B9), 0x1F85  => array(0x1F05, 0x3B9)
1248
+					,0x1F86  => array(0x1F06, 0x3B9), 0x1F87  => array(0x1F07, 0x3B9)
1249
+					,0x1F88  => array(0x1F00, 0x3B9), 0x1F89  => array(0x1F01, 0x3B9)
1250
+					,0x1F8A  => array(0x1F02, 0x3B9), 0x1F8B  => array(0x1F03, 0x3B9)
1251
+					,0x1F8C  => array(0x1F04, 0x3B9), 0x1F8D  => array(0x1F05, 0x3B9)
1252
+					,0x1F8E  => array(0x1F06, 0x3B9), 0x1F8F  => array(0x1F07, 0x3B9)
1253
+					,0x1F90  => array(0x1F20, 0x3B9), 0x1F91  => array(0x1F21, 0x3B9)
1254
+					,0x1F92  => array(0x1F22, 0x3B9), 0x1F93  => array(0x1F23, 0x3B9)
1255
+					,0x1F94  => array(0x1F24, 0x3B9), 0x1F95  => array(0x1F25, 0x3B9)
1256
+					,0x1F96  => array(0x1F26, 0x3B9), 0x1F97  => array(0x1F27, 0x3B9)
1257
+					,0x1F98  => array(0x1F20, 0x3B9), 0x1F99  => array(0x1F21, 0x3B9)
1258
+					,0x1F9A  => array(0x1F22, 0x3B9), 0x1F9B  => array(0x1F23, 0x3B9)
1259
+					,0x1F9C  => array(0x1F24, 0x3B9), 0x1F9D  => array(0x1F25, 0x3B9)
1260
+					,0x1F9E  => array(0x1F26, 0x3B9), 0x1F9F  => array(0x1F27, 0x3B9)
1261
+					,0x1FA0  => array(0x1F60, 0x3B9), 0x1FA1  => array(0x1F61, 0x3B9)
1262
+					,0x1FA2  => array(0x1F62, 0x3B9), 0x1FA3  => array(0x1F63, 0x3B9)
1263
+					,0x1FA4  => array(0x1F64, 0x3B9), 0x1FA5  => array(0x1F65, 0x3B9)
1264
+					,0x1FA6  => array(0x1F66, 0x3B9), 0x1FA7  => array(0x1F67, 0x3B9)
1265
+					,0x1FA8  => array(0x1F60, 0x3B9), 0x1FA9  => array(0x1F61, 0x3B9)
1266
+					,0x1FAA  => array(0x1F62, 0x3B9), 0x1FAB  => array(0x1F63, 0x3B9)
1267
+					,0x1FAC  => array(0x1F64, 0x3B9), 0x1FAD  => array(0x1F65, 0x3B9)
1268
+					,0x1FAE  => array(0x1F66, 0x3B9), 0x1FAF  => array(0x1F67, 0x3B9)
1269
+					,0x1FB2  => array(0x1F70, 0x3B9), 0x1FB3  => array(0x3B1, 0x3B9)
1270
+					,0x1FB4  => array(0x3AC, 0x3B9), 0x1FB6  => array(0x3B1, 0x342)
1271
+					,0x1FB7  => array(0x3B1, 0x342, 0x3B9), 0x1FB8  => array(0x1FB0)
1272
+					,0x1FB9  => array(0x1FB1), 0x1FBA  => array(0x1F70), 0x1FBB  => array(0x1F71)
1273
+					,0x1FBC  => array(0x3B1, 0x3B9), 0x1FBE  => array(0x3B9)
1274
+					,0x1FC2  => array(0x1F74, 0x3B9), 0x1FC3  => array(0x3B7, 0x3B9)
1275
+					,0x1FC4  => array(0x3AE, 0x3B9), 0x1FC6  => array(0x3B7, 0x342)
1276
+					,0x1FC7  => array(0x3B7, 0x342, 0x3B9), 0x1FC8  => array(0x1F72)
1277
+					,0x1FC9  => array(0x1F73), 0x1FCA  => array(0x1F74), 0x1FCB  => array(0x1F75)
1278
+					,0x1FCC  => array(0x3B7, 0x3B9), 0x1FD2  => array(0x3B9, 0x308, 0x300)
1279
+					,0x1FD3  => array(0x3B9, 0x308, 0x301), 0x1FD6  => array(0x3B9, 0x342)
1280
+					,0x1FD7  => array(0x3B9, 0x308, 0x342), 0x1FD8  => array(0x1FD0)
1281
+					,0x1FD9  => array(0x1FD1), 0x1FDA  => array(0x1F76)
1282
+					,0x1FDB  => array(0x1F77), 0x1FE2  => array(0x3C5, 0x308, 0x300)
1283
+					,0x1FE3  => array(0x3C5, 0x308, 0x301), 0x1FE4  => array(0x3C1, 0x313)
1284
+					,0x1FE6  => array(0x3C5, 0x342), 0x1FE7  => array(0x3C5, 0x308, 0x342)
1285
+					,0x1FE8  => array(0x1FE0), 0x1FE9  => array(0x1FE1)
1286
+					,0x1FEA  => array(0x1F7A), 0x1FEB  => array(0x1F7B)
1287
+					,0x1FEC  => array(0x1FE5), 0x1FF2  => array(0x1F7C, 0x3B9)
1288
+					,0x1FF3  => array(0x3C9, 0x3B9), 0x1FF4  => array(0x3CE, 0x3B9)
1289
+					,0x1FF6  => array(0x3C9, 0x342), 0x1FF7  => array(0x3C9, 0x342, 0x3B9)
1290
+					,0x1FF8  => array(0x1F78), 0x1FF9  => array(0x1F79), 0x1FFA  => array(0x1F7C)
1291
+					,0x1FFB  => array(0x1F7D), 0x1FFC  => array(0x3C9, 0x3B9)
1292
+					,0x20A8  => array(0x72, 0x73), 0x2102  => array(0x63), 0x2103  => array(0xB0, 0x63)
1293
+					,0x2107  => array(0x25B), 0x2109  => array(0xB0, 0x66), 0x210B  => array(0x68)
1294
+					,0x210C  => array(0x68), 0x210D  => array(0x68), 0x2110  => array(0x69)
1295
+					,0x2111  => array(0x69), 0x2112  => array(0x6C), 0x2115  => array(0x6E)
1296
+					,0x2116  => array(0x6E, 0x6F), 0x2119  => array(0x70), 0x211A  => array(0x71)
1297
+					,0x211B  => array(0x72), 0x211C  => array(0x72), 0x211D  => array(0x72)
1298
+					,0x2120  => array(0x73, 0x6D), 0x2121  => array(0x74, 0x65, 0x6C)
1299
+					,0x2122  => array(0x74, 0x6D), 0x2124  => array(0x7A), 0x2126  => array(0x3C9)
1300
+					,0x2128  => array(0x7A), 0x212A  => array(0x6B), 0x212B  => array(0xE5)
1301
+					,0x212C  => array(0x62), 0x212D  => array(0x63), 0x2130  => array(0x65)
1302
+					,0x2131  => array(0x66), 0x2133  => array(0x6D), 0x213E  => array(0x3B3)
1303
+					,0x213F  => array(0x3C0), 0x2145  => array(0x64) ,0x2160  => array(0x2170)
1304
+					,0x2161  => array(0x2171), 0x2162  => array(0x2172), 0x2163  => array(0x2173)
1305
+					,0x2164  => array(0x2174), 0x2165  => array(0x2175), 0x2166  => array(0x2176)
1306
+					,0x2167  => array(0x2177), 0x2168  => array(0x2178), 0x2169  => array(0x2179)
1307
+					,0x216A  => array(0x217A), 0x216B  => array(0x217B), 0x216C  => array(0x217C)
1308
+					,0x216D  => array(0x217D), 0x216E  => array(0x217E), 0x216F  => array(0x217F)
1309
+					,0x24B6  => array(0x24D0), 0x24B7  => array(0x24D1), 0x24B8  => array(0x24D2)
1310
+					,0x24B9  => array(0x24D3), 0x24BA  => array(0x24D4), 0x24BB  => array(0x24D5)
1311
+					,0x24BC  => array(0x24D6), 0x24BD  => array(0x24D7), 0x24BE  => array(0x24D8)
1312
+					,0x24BF  => array(0x24D9), 0x24C0  => array(0x24DA), 0x24C1  => array(0x24DB)
1313
+					,0x24C2  => array(0x24DC), 0x24C3  => array(0x24DD), 0x24C4  => array(0x24DE)
1314
+					,0x24C5  => array(0x24DF), 0x24C6  => array(0x24E0), 0x24C7  => array(0x24E1)
1315
+					,0x24C8  => array(0x24E2), 0x24C9  => array(0x24E3), 0x24CA  => array(0x24E4)
1316
+					,0x24CB  => array(0x24E5), 0x24CC  => array(0x24E6), 0x24CD  => array(0x24E7)
1317
+					,0x24CE  => array(0x24E8), 0x24CF  => array(0x24E9), 0x3371  => array(0x68, 0x70, 0x61)
1318
+					,0x3373  => array(0x61, 0x75), 0x3375  => array(0x6F, 0x76)
1319
+					,0x3380  => array(0x70, 0x61), 0x3381  => array(0x6E, 0x61)
1320
+					,0x3382  => array(0x3BC, 0x61), 0x3383  => array(0x6D, 0x61)
1321
+					,0x3384  => array(0x6B, 0x61), 0x3385  => array(0x6B, 0x62)
1322
+					,0x3386  => array(0x6D, 0x62), 0x3387  => array(0x67, 0x62)
1323
+					,0x338A  => array(0x70, 0x66), 0x338B  => array(0x6E, 0x66)
1324
+					,0x338C  => array(0x3BC, 0x66), 0x3390  => array(0x68, 0x7A)
1325
+					,0x3391  => array(0x6B, 0x68, 0x7A), 0x3392  => array(0x6D, 0x68, 0x7A)
1326
+					,0x3393  => array(0x67, 0x68, 0x7A), 0x3394  => array(0x74, 0x68, 0x7A)
1327
+					,0x33A9  => array(0x70, 0x61), 0x33AA  => array(0x6B, 0x70, 0x61)
1328
+					,0x33AB  => array(0x6D, 0x70, 0x61), 0x33AC  => array(0x67, 0x70, 0x61)
1329
+					,0x33B4  => array(0x70, 0x76), 0x33B5  => array(0x6E, 0x76)
1330
+					,0x33B6  => array(0x3BC, 0x76), 0x33B7  => array(0x6D, 0x76)
1331
+					,0x33B8  => array(0x6B, 0x76), 0x33B9  => array(0x6D, 0x76)
1332
+					,0x33BA  => array(0x70, 0x77), 0x33BB  => array(0x6E, 0x77)
1333
+					,0x33BC  => array(0x3BC, 0x77), 0x33BD  => array(0x6D, 0x77)
1334
+					,0x33BE  => array(0x6B, 0x77), 0x33BF  => array(0x6D, 0x77)
1335
+					,0x33C0  => array(0x6B, 0x3C9), 0x33C1  => array(0x6D, 0x3C9) /*
1336 1336
                     ,0x33C2  => array(0x61, 0x2E, 0x6D, 0x2E) */
1337
-                    ,0x33C3  => array(0x62, 0x71), 0x33C6  => array(0x63, 0x2215, 0x6B, 0x67)
1338
-                    ,0x33C7  => array(0x63, 0x6F, 0x2E), 0x33C8  => array(0x64, 0x62)
1339
-                    ,0x33C9  => array(0x67, 0x79), 0x33CB  => array(0x68, 0x70)
1340
-                    ,0x33CD  => array(0x6B, 0x6B), 0x33CE  => array(0x6B, 0x6D)
1341
-                    ,0x33D7  => array(0x70, 0x68), 0x33D9  => array(0x70, 0x70, 0x6D)
1342
-                    ,0x33DA  => array(0x70, 0x72), 0x33DC  => array(0x73, 0x76)
1343
-                    ,0x33DD  => array(0x77, 0x62), 0xFB00  => array(0x66, 0x66)
1344
-                    ,0xFB01  => array(0x66, 0x69), 0xFB02  => array(0x66, 0x6C)
1345
-                    ,0xFB03  => array(0x66, 0x66, 0x69), 0xFB04  => array(0x66, 0x66, 0x6C)
1346
-                    ,0xFB05  => array(0x73, 0x74), 0xFB06  => array(0x73, 0x74)
1347
-                    ,0xFB13  => array(0x574, 0x576), 0xFB14  => array(0x574, 0x565)
1348
-                    ,0xFB15  => array(0x574, 0x56B), 0xFB16  => array(0x57E, 0x576)
1349
-                    ,0xFB17  => array(0x574, 0x56D), 0xFF21  => array(0xFF41)
1350
-                    ,0xFF22  => array(0xFF42), 0xFF23  => array(0xFF43), 0xFF24  => array(0xFF44)
1351
-                    ,0xFF25  => array(0xFF45), 0xFF26  => array(0xFF46), 0xFF27  => array(0xFF47)
1352
-                    ,0xFF28  => array(0xFF48), 0xFF29  => array(0xFF49), 0xFF2A  => array(0xFF4A)
1353
-                    ,0xFF2B  => array(0xFF4B), 0xFF2C  => array(0xFF4C), 0xFF2D  => array(0xFF4D)
1354
-                    ,0xFF2E  => array(0xFF4E), 0xFF2F  => array(0xFF4F), 0xFF30  => array(0xFF50)
1355
-                    ,0xFF31  => array(0xFF51), 0xFF32  => array(0xFF52), 0xFF33  => array(0xFF53)
1356
-                    ,0xFF34  => array(0xFF54), 0xFF35  => array(0xFF55), 0xFF36  => array(0xFF56)
1357
-                    ,0xFF37  => array(0xFF57), 0xFF38  => array(0xFF58), 0xFF39  => array(0xFF59)
1358
-                    ,0xFF3A  => array(0xFF5A), 0x10400 => array(0x10428), 0x10401 => array(0x10429)
1359
-                    ,0x10402 => array(0x1042A), 0x10403 => array(0x1042B), 0x10404 => array(0x1042C)
1360
-                    ,0x10405 => array(0x1042D), 0x10406 => array(0x1042E), 0x10407 => array(0x1042F)
1361
-                    ,0x10408 => array(0x10430), 0x10409 => array(0x10431), 0x1040A => array(0x10432)
1362
-                    ,0x1040B => array(0x10433), 0x1040C => array(0x10434), 0x1040D => array(0x10435)
1363
-                    ,0x1040E => array(0x10436), 0x1040F => array(0x10437), 0x10410 => array(0x10438)
1364
-                    ,0x10411 => array(0x10439), 0x10412 => array(0x1043A), 0x10413 => array(0x1043B)
1365
-                    ,0x10414 => array(0x1043C), 0x10415 => array(0x1043D), 0x10416 => array(0x1043E)
1366
-                    ,0x10417 => array(0x1043F), 0x10418 => array(0x10440), 0x10419 => array(0x10441)
1367
-                    ,0x1041A => array(0x10442), 0x1041B => array(0x10443), 0x1041C => array(0x10444)
1368
-                    ,0x1041D => array(0x10445), 0x1041E => array(0x10446), 0x1041F => array(0x10447)
1369
-                    ,0x10420 => array(0x10448), 0x10421 => array(0x10449), 0x10422 => array(0x1044A)
1370
-                    ,0x10423 => array(0x1044B), 0x10424 => array(0x1044C), 0x10425 => array(0x1044D)
1371
-                    ,0x1D400 => array(0x61), 0x1D401 => array(0x62), 0x1D402 => array(0x63)
1372
-                    ,0x1D403 => array(0x64), 0x1D404 => array(0x65), 0x1D405 => array(0x66)
1373
-                    ,0x1D406 => array(0x67), 0x1D407 => array(0x68), 0x1D408 => array(0x69)
1374
-                    ,0x1D409 => array(0x6A), 0x1D40A => array(0x6B), 0x1D40B => array(0x6C)
1375
-                    ,0x1D40C => array(0x6D), 0x1D40D => array(0x6E), 0x1D40E => array(0x6F)
1376
-                    ,0x1D40F => array(0x70), 0x1D410 => array(0x71), 0x1D411 => array(0x72)
1377
-                    ,0x1D412 => array(0x73), 0x1D413 => array(0x74), 0x1D414 => array(0x75)
1378
-                    ,0x1D415 => array(0x76), 0x1D416 => array(0x77), 0x1D417 => array(0x78)
1379
-                    ,0x1D418 => array(0x79), 0x1D419 => array(0x7A), 0x1D434 => array(0x61)
1380
-                    ,0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64)
1381
-                    ,0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67)
1382
-                    ,0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A)
1383
-                    ,0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D)
1384
-                    ,0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70)
1385
-                    ,0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73)
1386
-                    ,0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76)
1387
-                    ,0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79)
1388
-                    ,0x1D44D => array(0x7A), 0x1D468 => array(0x61), 0x1D469 => array(0x62)
1389
-                    ,0x1D46A => array(0x63), 0x1D46B => array(0x64), 0x1D46C => array(0x65)
1390
-                    ,0x1D46D => array(0x66), 0x1D46E => array(0x67), 0x1D46F => array(0x68)
1391
-                    ,0x1D470 => array(0x69), 0x1D471 => array(0x6A), 0x1D472 => array(0x6B)
1392
-                    ,0x1D473 => array(0x6C), 0x1D474 => array(0x6D), 0x1D475 => array(0x6E)
1393
-                    ,0x1D476 => array(0x6F), 0x1D477 => array(0x70), 0x1D478 => array(0x71)
1394
-                    ,0x1D479 => array(0x72), 0x1D47A => array(0x73), 0x1D47B => array(0x74)
1395
-                    ,0x1D47C => array(0x75), 0x1D47D => array(0x76), 0x1D47E => array(0x77)
1396
-                    ,0x1D47F => array(0x78), 0x1D480 => array(0x79), 0x1D481 => array(0x7A)
1397
-                    ,0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64)
1398
-                    ,0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B)
1399
-                    ,0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70)
1400
-                    ,0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74)
1401
-                    ,0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77)
1402
-                    ,0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A)
1403
-                    ,0x1D4D0 => array(0x61), 0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63)
1404
-                    ,0x1D4D3 => array(0x64), 0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66)
1405
-                    ,0x1D4D6 => array(0x67), 0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69)
1406
-                    ,0x1D4D9 => array(0x6A), 0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C)
1407
-                    ,0x1D4DC => array(0x6D), 0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F)
1408
-                    ,0x1D4DF => array(0x70), 0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72)
1409
-                    ,0x1D4E2 => array(0x73), 0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75)
1410
-                    ,0x1D4E5 => array(0x76), 0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78)
1411
-                    ,0x1D4E8 => array(0x79), 0x1D4E9 => array(0x7A), 0x1D504 => array(0x61)
1412
-                    ,0x1D505 => array(0x62), 0x1D507 => array(0x64), 0x1D508 => array(0x65)
1413
-                    ,0x1D509 => array(0x66), 0x1D50A => array(0x67), 0x1D50D => array(0x6A)
1414
-                    ,0x1D50E => array(0x6B), 0x1D50F => array(0x6C), 0x1D510 => array(0x6D)
1415
-                    ,0x1D511 => array(0x6E), 0x1D512 => array(0x6F), 0x1D513 => array(0x70)
1416
-                    ,0x1D514 => array(0x71), 0x1D516 => array(0x73), 0x1D517 => array(0x74)
1417
-                    ,0x1D518 => array(0x75), 0x1D519 => array(0x76), 0x1D51A => array(0x77)
1418
-                    ,0x1D51B => array(0x78), 0x1D51C => array(0x79), 0x1D538 => array(0x61)
1419
-                    ,0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65)
1420
-                    ,0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69)
1421
-                    ,0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C)
1422
-                    ,0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73)
1423
-                    ,0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76)
1424
-                    ,0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79)
1425
-                    ,0x1D56C => array(0x61), 0x1D56D => array(0x62), 0x1D56E => array(0x63)
1426
-                    ,0x1D56F => array(0x64), 0x1D570 => array(0x65), 0x1D571 => array(0x66)
1427
-                    ,0x1D572 => array(0x67), 0x1D573 => array(0x68), 0x1D574 => array(0x69)
1428
-                    ,0x1D575 => array(0x6A), 0x1D576 => array(0x6B), 0x1D577 => array(0x6C)
1429
-                    ,0x1D578 => array(0x6D), 0x1D579 => array(0x6E), 0x1D57A => array(0x6F)
1430
-                    ,0x1D57B => array(0x70), 0x1D57C => array(0x71), 0x1D57D => array(0x72)
1431
-                    ,0x1D57E => array(0x73), 0x1D57F => array(0x74), 0x1D580 => array(0x75)
1432
-                    ,0x1D581 => array(0x76), 0x1D582 => array(0x77), 0x1D583 => array(0x78)
1433
-                    ,0x1D584 => array(0x79), 0x1D585 => array(0x7A), 0x1D5A0 => array(0x61)
1434
-                    ,0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63), 0x1D5A3 => array(0x64)
1435
-                    ,0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66), 0x1D5A6 => array(0x67)
1436
-                    ,0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69), 0x1D5A9 => array(0x6A)
1437
-                    ,0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C), 0x1D5AC => array(0x6D)
1438
-                    ,0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F), 0x1D5AF => array(0x70)
1439
-                    ,0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72), 0x1D5B2 => array(0x73)
1440
-                    ,0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75), 0x1D5B5 => array(0x76)
1441
-                    ,0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78), 0x1D5B8 => array(0x79)
1442
-                    ,0x1D5B9 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62)
1443
-                    ,0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65)
1444
-                    ,0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68)
1445
-                    ,0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B)
1446
-                    ,0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E)
1447
-                    ,0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71)
1448
-                    ,0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74)
1449
-                    ,0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77)
1450
-                    ,0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A)
1451
-                    ,0x1D608 => array(0x61), 0x1D609 => array(0x62) ,0x1D60A => array(0x63)
1452
-                    ,0x1D60B => array(0x64), 0x1D60C => array(0x65), 0x1D60D => array(0x66)
1453
-                    ,0x1D60E => array(0x67), 0x1D60F => array(0x68), 0x1D610 => array(0x69)
1454
-                    ,0x1D611 => array(0x6A), 0x1D612 => array(0x6B), 0x1D613 => array(0x6C)
1455
-                    ,0x1D614 => array(0x6D), 0x1D615 => array(0x6E), 0x1D616 => array(0x6F)
1456
-                    ,0x1D617 => array(0x70), 0x1D618 => array(0x71), 0x1D619 => array(0x72)
1457
-                    ,0x1D61A => array(0x73), 0x1D61B => array(0x74), 0x1D61C => array(0x75)
1458
-                    ,0x1D61D => array(0x76), 0x1D61E => array(0x77), 0x1D61F => array(0x78)
1459
-                    ,0x1D620 => array(0x79), 0x1D621 => array(0x7A), 0x1D63C => array(0x61)
1460
-                    ,0x1D63D => array(0x62), 0x1D63E => array(0x63), 0x1D63F => array(0x64)
1461
-                    ,0x1D640 => array(0x65), 0x1D641 => array(0x66), 0x1D642 => array(0x67)
1462
-                    ,0x1D643 => array(0x68), 0x1D644 => array(0x69), 0x1D645 => array(0x6A)
1463
-                    ,0x1D646 => array(0x6B), 0x1D647 => array(0x6C), 0x1D648 => array(0x6D)
1464
-                    ,0x1D649 => array(0x6E), 0x1D64A => array(0x6F), 0x1D64B => array(0x70)
1465
-                    ,0x1D64C => array(0x71), 0x1D64D => array(0x72), 0x1D64E => array(0x73)
1466
-                    ,0x1D64F => array(0x74), 0x1D650 => array(0x75), 0x1D651 => array(0x76)
1467
-                    ,0x1D652 => array(0x77), 0x1D653 => array(0x78), 0x1D654 => array(0x79)
1468
-                    ,0x1D655 => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62)
1469
-                    ,0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65)
1470
-                    ,0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68)
1471
-                    ,0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B)
1472
-                    ,0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E)
1473
-                    ,0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71)
1474
-                    ,0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74)
1475
-                    ,0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77)
1476
-                    ,0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A)
1477
-                    ,0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2), 0x1D6AA => array(0x3B3)
1478
-                    ,0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5), 0x1D6AD => array(0x3B6)
1479
-                    ,0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8), 0x1D6B0 => array(0x3B9)
1480
-                    ,0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB), 0x1D6B3 => array(0x3BC)
1481
-                    ,0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE), 0x1D6B6 => array(0x3BF)
1482
-                    ,0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1), 0x1D6B9 => array(0x3B8)
1483
-                    ,0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4), 0x1D6BC => array(0x3C5)
1484
-                    ,0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7), 0x1D6BF => array(0x3C8)
1485
-                    ,0x1D6C0 => array(0x3C9), 0x1D6D3 => array(0x3C3), 0x1D6E2 => array(0x3B1)
1486
-                    ,0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4)
1487
-                    ,0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7)
1488
-                    ,0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA)
1489
-                    ,0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD)
1490
-                    ,0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0)
1491
-                    ,0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8) ,0x1D6F4 => array(0x3C3)
1492
-                    ,0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6)
1493
-                    ,0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8) ,0x1D6FA => array(0x3C9)
1494
-                    ,0x1D70D => array(0x3C3), 0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2)
1495
-                    ,0x1D71E => array(0x3B3), 0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5)
1496
-                    ,0x1D721 => array(0x3B6), 0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8)
1497
-                    ,0x1D724 => array(0x3B9), 0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB)
1498
-                    ,0x1D727 => array(0x3BC), 0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE)
1499
-                    ,0x1D72A => array(0x3BF), 0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1)
1500
-                    ,0x1D72D => array(0x3B8), 0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4)
1501
-                    ,0x1D730 => array(0x3C5), 0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7)
1502
-                    ,0x1D733 => array(0x3C8), 0x1D734 => array(0x3C9), 0x1D747 => array(0x3C3)
1503
-                    ,0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2), 0x1D758 => array(0x3B3)
1504
-                    ,0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5), 0x1D75B => array(0x3B6)
1505
-                    ,0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8), 0x1D75E => array(0x3B9)
1506
-                    ,0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB), 0x1D761 => array(0x3BC)
1507
-                    ,0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE), 0x1D764 => array(0x3BF)
1508
-                    ,0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1), 0x1D767 => array(0x3B8)
1509
-                    ,0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4), 0x1D76A => array(0x3C5)
1510
-                    ,0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7), 0x1D76D => array(0x3C8)
1511
-                    ,0x1D76E => array(0x3C9), 0x1D781 => array(0x3C3), 0x1D790 => array(0x3B1)
1512
-                    ,0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4)
1513
-                    ,0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7)
1514
-                    ,0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA)
1515
-                    ,0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD)
1516
-                    ,0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0)
1517
-                    ,0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3)
1518
-                    ,0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6)
1519
-                    ,0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9)
1520
-                    ,0x1D7BB => array(0x3C3), 0x3F9   => array(0x3C3), 0x1D2C  => array(0x61)
1521
-                    ,0x1D2D  => array(0xE6), 0x1D2E  => array(0x62), 0x1D30  => array(0x64)
1522
-                    ,0x1D31  => array(0x65), 0x1D32  => array(0x1DD), 0x1D33  => array(0x67)
1523
-                    ,0x1D34  => array(0x68), 0x1D35  => array(0x69), 0x1D36  => array(0x6A)
1524
-                    ,0x1D37  => array(0x6B), 0x1D38  => array(0x6C), 0x1D39  => array(0x6D)
1525
-                    ,0x1D3A  => array(0x6E), 0x1D3C  => array(0x6F), 0x1D3D  => array(0x223)
1526
-                    ,0x1D3E  => array(0x70), 0x1D3F  => array(0x72), 0x1D40  => array(0x74)
1527
-                    ,0x1D41  => array(0x75), 0x1D42  => array(0x77), 0x213B  => array(0x66, 0x61, 0x78)
1528
-                    ,0x3250  => array(0x70, 0x74, 0x65), 0x32CC  => array(0x68, 0x67)
1529
-                    ,0x32CE  => array(0x65, 0x76), 0x32CF  => array(0x6C, 0x74, 0x64)
1530
-                    ,0x337A  => array(0x69, 0x75), 0x33DE  => array(0x76, 0x2215, 0x6D)
1531
-                    ,0x33DF  => array(0x61, 0x2215, 0x6D)
1532
-                    )
1533
-            ,'norm_combcls' => array(0x334   => 1,   0x335   => 1,   0x336   => 1,   0x337   => 1
1534
-                    ,0x338   => 1,   0x93C   => 7,   0x9BC   => 7,   0xA3C   => 7,   0xABC   => 7
1535
-                    ,0xB3C   => 7,   0xCBC   => 7,   0x1037  => 7,   0x3099  => 8,   0x309A  => 8
1536
-                    ,0x94D   => 9,   0x9CD   => 9,   0xA4D   => 9,   0xACD   => 9,   0xB4D   => 9
1537
-                    ,0xBCD   => 9,   0xC4D   => 9,   0xCCD   => 9,   0xD4D   => 9,   0xDCA   => 9
1538
-                    ,0xE3A   => 9,   0xF84   => 9,   0x1039  => 9,   0x1714  => 9,   0x1734  => 9
1539
-                    ,0x17D2  => 9,   0x5B0   => 10,  0x5B1   => 11,  0x5B2   => 12,  0x5B3   => 13
1540
-                    ,0x5B4   => 14,  0x5B5   => 15,  0x5B6   => 16,  0x5B7   => 17,  0x5B8   => 18
1541
-                    ,0x5B9   => 19,  0x5BB   => 20,  0x5Bc   => 21,  0x5BD   => 22,  0x5BF   => 23
1542
-                    ,0x5C1   => 24,  0x5C2   => 25,  0xFB1E  => 26,  0x64B   => 27,  0x64C   => 28
1543
-                    ,0x64D   => 29,  0x64E   => 30,  0x64F   => 31,  0x650   => 32,  0x651   => 33
1544
-                    ,0x652   => 34,  0x670   => 35,  0x711   => 36,  0xC55   => 84,  0xC56   => 91
1545
-                    ,0xE38   => 103, 0xE39   => 103, 0xE48   => 107, 0xE49   => 107, 0xE4A   => 107
1546
-                    ,0xE4B   => 107, 0xEB8   => 118, 0xEB9   => 118, 0xEC8   => 122, 0xEC9   => 122
1547
-                    ,0xECA   => 122, 0xECB   => 122, 0xF71   => 129, 0xF72   => 130, 0xF7A   => 130
1548
-                    ,0xF7B   => 130, 0xF7C   => 130, 0xF7D   => 130, 0xF80   => 130, 0xF74   => 132
1549
-                    ,0x321   => 202, 0x322   => 202, 0x327   => 202, 0x328   => 202, 0x31B   => 216
1550
-                    ,0xF39   => 216, 0x1D165 => 216, 0x1D166 => 216, 0x1D16E => 216, 0x1D16F => 216
1551
-                    ,0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216, 0x302A  => 218, 0x316   => 220
1552
-                    ,0x317   => 220, 0x318   => 220, 0x319   => 220, 0x31C   => 220, 0x31D   => 220
1553
-                    ,0x31E   => 220, 0x31F   => 220, 0x320   => 220, 0x323   => 220, 0x324   => 220
1554
-                    ,0x325   => 220, 0x326   => 220, 0x329   => 220, 0x32A   => 220, 0x32B   => 220
1555
-                    ,0x32C   => 220, 0x32D   => 220, 0x32E   => 220, 0x32F   => 220, 0x330   => 220
1556
-                    ,0x331   => 220, 0x332   => 220, 0x333   => 220, 0x339   => 220, 0x33A   => 220
1557
-                    ,0x33B   => 220, 0x33C   => 220, 0x347   => 220, 0x348   => 220, 0x349   => 220
1558
-                    ,0x34D   => 220, 0x34E   => 220, 0x353   => 220, 0x354   => 220, 0x355   => 220
1559
-                    ,0x356   => 220, 0x591   => 220, 0x596   => 220, 0x59B   => 220, 0x5A3   => 220
1560
-                    ,0x5A4   => 220, 0x5A5   => 220, 0x5A6   => 220, 0x5A7   => 220, 0x5AA   => 220
1561
-                    ,0x655   => 220, 0x656   => 220, 0x6E3   => 220, 0x6EA   => 220, 0x6ED   => 220
1562
-                    ,0x731   => 220, 0x734   => 220, 0x737   => 220, 0x738   => 220, 0x739   => 220
1563
-                    ,0x73B   => 220, 0x73C   => 220, 0x73E   => 220, 0x742   => 220, 0x744   => 220
1564
-                    ,0x746   => 220, 0x748   => 220, 0x952   => 220, 0xF18   => 220, 0xF19   => 220
1565
-                    ,0xF35   => 220, 0xF37   => 220, 0xFC6   => 220, 0x193B  => 220, 0x20E8  => 220
1566
-                    ,0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220
1567
-                    ,0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220
1568
-                    ,0x59A   => 222, 0x5AD   => 222, 0x1929  => 222, 0x302D  => 222, 0x302E  => 224
1569
-                    ,0x302F  => 224, 0x1D16D => 226, 0x5AE   => 228, 0x18A9  => 228, 0x302B  => 228
1570
-                    ,0x300   => 230, 0x301   => 230, 0x302   => 230, 0x303   => 230, 0x304   => 230
1571
-                    ,0x305   => 230, 0x306   => 230, 0x307   => 230, 0x308   => 230, 0x309   => 230
1572
-                    ,0x30A   => 230, 0x30B   => 230, 0x30C   => 230, 0x30D   => 230, 0x30E   => 230
1573
-                    ,0x30F   => 230, 0x310   => 230, 0x311   => 230, 0x312   => 230, 0x313   => 230
1574
-                    ,0x314   => 230, 0x33D   => 230, 0x33E   => 230, 0x33F   => 230, 0x340   => 230
1575
-                    ,0x341   => 230, 0x342   => 230, 0x343   => 230, 0x344   => 230, 0x346   => 230
1576
-                    ,0x34A   => 230, 0x34B   => 230, 0x34C   => 230, 0x350   => 230, 0x351   => 230
1577
-                    ,0x352   => 230, 0x357   => 230, 0x363   => 230, 0x364   => 230, 0x365   => 230
1578
-                    ,0x366   => 230, 0x367   => 230, 0x368   => 230, 0x369   => 230, 0x36A   => 230
1579
-                    ,0x36B   => 230, 0x36C   => 230, 0x36D   => 230, 0x36E   => 230, 0x36F   => 230
1580
-                    ,0x483   => 230, 0x484   => 230, 0x485   => 230, 0x486   => 230, 0x592   => 230
1581
-                    ,0x593   => 230, 0x594   => 230, 0x595   => 230, 0x597   => 230, 0x598   => 230
1582
-                    ,0x599   => 230, 0x59C   => 230, 0x59D   => 230, 0x59E   => 230, 0x59F   => 230
1583
-                    ,0x5A0   => 230, 0x5A1   => 230, 0x5A8   => 230, 0x5A9   => 230, 0x5AB   => 230
1584
-                    ,0x5AC   => 230, 0x5AF   => 230, 0x5C4   => 230, 0x610   => 230, 0x611   => 230
1585
-                    ,0x612   => 230, 0x613   => 230, 0x614   => 230, 0x615   => 230, 0x653   => 230
1586
-                    ,0x654   => 230, 0x657   => 230, 0x658   => 230, 0x6D6   => 230, 0x6D7   => 230
1587
-                    ,0x6D8   => 230, 0x6D9   => 230, 0x6DA   => 230, 0x6DB   => 230, 0x6DC   => 230
1588
-                    ,0x6DF   => 230, 0x6E0   => 230, 0x6E1   => 230, 0x6E2   => 230, 0x6E4   => 230
1589
-                    ,0x6E7   => 230, 0x6E8   => 230, 0x6EB   => 230, 0x6EC   => 230, 0x730   => 230
1590
-                    ,0x732   => 230, 0x733   => 230, 0x735   => 230, 0x736   => 230, 0x73A   => 230
1591
-                    ,0x73D   => 230, 0x73F   => 230, 0x740   => 230, 0x741   => 230, 0x743   => 230
1592
-                    ,0x745   => 230, 0x747   => 230, 0x749   => 230, 0x74A   => 230, 0x951   => 230
1593
-                    ,0x953   => 230, 0x954   => 230, 0xF82   => 230, 0xF83   => 230, 0xF86   => 230
1594
-                    ,0xF87   => 230, 0x170D  => 230, 0x193A  => 230, 0x20D0  => 230, 0x20D1  => 230
1595
-                    ,0x20D4  => 230, 0x20D5  => 230, 0x20D6  => 230, 0x20D7  => 230, 0x20DB  => 230
1596
-                    ,0x20DC  => 230, 0x20E1  => 230, 0x20E7  => 230, 0x20E9  => 230, 0xFE20  => 230
1597
-                    ,0xFE21  => 230, 0xFE22  => 230, 0xFE23  => 230, 0x1D185 => 230, 0x1D186 => 230
1598
-                    ,0x1D187 => 230, 0x1D189 => 230, 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230
1599
-                    ,0x1D1AC => 230, 0x1D1AD => 230, 0x315   => 232, 0x31A   => 232, 0x302C  => 232
1600
-                    ,0x35F   => 233, 0x362   => 233, 0x35D   => 234, 0x35E   => 234, 0x360   => 234
1601
-                    ,0x361   => 234, 0x345   => 240
1602
-                    )
1603
-            );
1337
+					,0x33C3  => array(0x62, 0x71), 0x33C6  => array(0x63, 0x2215, 0x6B, 0x67)
1338
+					,0x33C7  => array(0x63, 0x6F, 0x2E), 0x33C8  => array(0x64, 0x62)
1339
+					,0x33C9  => array(0x67, 0x79), 0x33CB  => array(0x68, 0x70)
1340
+					,0x33CD  => array(0x6B, 0x6B), 0x33CE  => array(0x6B, 0x6D)
1341
+					,0x33D7  => array(0x70, 0x68), 0x33D9  => array(0x70, 0x70, 0x6D)
1342
+					,0x33DA  => array(0x70, 0x72), 0x33DC  => array(0x73, 0x76)
1343
+					,0x33DD  => array(0x77, 0x62), 0xFB00  => array(0x66, 0x66)
1344
+					,0xFB01  => array(0x66, 0x69), 0xFB02  => array(0x66, 0x6C)
1345
+					,0xFB03  => array(0x66, 0x66, 0x69), 0xFB04  => array(0x66, 0x66, 0x6C)
1346
+					,0xFB05  => array(0x73, 0x74), 0xFB06  => array(0x73, 0x74)
1347
+					,0xFB13  => array(0x574, 0x576), 0xFB14  => array(0x574, 0x565)
1348
+					,0xFB15  => array(0x574, 0x56B), 0xFB16  => array(0x57E, 0x576)
1349
+					,0xFB17  => array(0x574, 0x56D), 0xFF21  => array(0xFF41)
1350
+					,0xFF22  => array(0xFF42), 0xFF23  => array(0xFF43), 0xFF24  => array(0xFF44)
1351
+					,0xFF25  => array(0xFF45), 0xFF26  => array(0xFF46), 0xFF27  => array(0xFF47)
1352
+					,0xFF28  => array(0xFF48), 0xFF29  => array(0xFF49), 0xFF2A  => array(0xFF4A)
1353
+					,0xFF2B  => array(0xFF4B), 0xFF2C  => array(0xFF4C), 0xFF2D  => array(0xFF4D)
1354
+					,0xFF2E  => array(0xFF4E), 0xFF2F  => array(0xFF4F), 0xFF30  => array(0xFF50)
1355
+					,0xFF31  => array(0xFF51), 0xFF32  => array(0xFF52), 0xFF33  => array(0xFF53)
1356
+					,0xFF34  => array(0xFF54), 0xFF35  => array(0xFF55), 0xFF36  => array(0xFF56)
1357
+					,0xFF37  => array(0xFF57), 0xFF38  => array(0xFF58), 0xFF39  => array(0xFF59)
1358
+					,0xFF3A  => array(0xFF5A), 0x10400 => array(0x10428), 0x10401 => array(0x10429)
1359
+					,0x10402 => array(0x1042A), 0x10403 => array(0x1042B), 0x10404 => array(0x1042C)
1360
+					,0x10405 => array(0x1042D), 0x10406 => array(0x1042E), 0x10407 => array(0x1042F)
1361
+					,0x10408 => array(0x10430), 0x10409 => array(0x10431), 0x1040A => array(0x10432)
1362
+					,0x1040B => array(0x10433), 0x1040C => array(0x10434), 0x1040D => array(0x10435)
1363
+					,0x1040E => array(0x10436), 0x1040F => array(0x10437), 0x10410 => array(0x10438)
1364
+					,0x10411 => array(0x10439), 0x10412 => array(0x1043A), 0x10413 => array(0x1043B)
1365
+					,0x10414 => array(0x1043C), 0x10415 => array(0x1043D), 0x10416 => array(0x1043E)
1366
+					,0x10417 => array(0x1043F), 0x10418 => array(0x10440), 0x10419 => array(0x10441)
1367
+					,0x1041A => array(0x10442), 0x1041B => array(0x10443), 0x1041C => array(0x10444)
1368
+					,0x1041D => array(0x10445), 0x1041E => array(0x10446), 0x1041F => array(0x10447)
1369
+					,0x10420 => array(0x10448), 0x10421 => array(0x10449), 0x10422 => array(0x1044A)
1370
+					,0x10423 => array(0x1044B), 0x10424 => array(0x1044C), 0x10425 => array(0x1044D)
1371
+					,0x1D400 => array(0x61), 0x1D401 => array(0x62), 0x1D402 => array(0x63)
1372
+					,0x1D403 => array(0x64), 0x1D404 => array(0x65), 0x1D405 => array(0x66)
1373
+					,0x1D406 => array(0x67), 0x1D407 => array(0x68), 0x1D408 => array(0x69)
1374
+					,0x1D409 => array(0x6A), 0x1D40A => array(0x6B), 0x1D40B => array(0x6C)
1375
+					,0x1D40C => array(0x6D), 0x1D40D => array(0x6E), 0x1D40E => array(0x6F)
1376
+					,0x1D40F => array(0x70), 0x1D410 => array(0x71), 0x1D411 => array(0x72)
1377
+					,0x1D412 => array(0x73), 0x1D413 => array(0x74), 0x1D414 => array(0x75)
1378
+					,0x1D415 => array(0x76), 0x1D416 => array(0x77), 0x1D417 => array(0x78)
1379
+					,0x1D418 => array(0x79), 0x1D419 => array(0x7A), 0x1D434 => array(0x61)
1380
+					,0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64)
1381
+					,0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67)
1382
+					,0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A)
1383
+					,0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D)
1384
+					,0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70)
1385
+					,0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73)
1386
+					,0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76)
1387
+					,0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79)
1388
+					,0x1D44D => array(0x7A), 0x1D468 => array(0x61), 0x1D469 => array(0x62)
1389
+					,0x1D46A => array(0x63), 0x1D46B => array(0x64), 0x1D46C => array(0x65)
1390
+					,0x1D46D => array(0x66), 0x1D46E => array(0x67), 0x1D46F => array(0x68)
1391
+					,0x1D470 => array(0x69), 0x1D471 => array(0x6A), 0x1D472 => array(0x6B)
1392
+					,0x1D473 => array(0x6C), 0x1D474 => array(0x6D), 0x1D475 => array(0x6E)
1393
+					,0x1D476 => array(0x6F), 0x1D477 => array(0x70), 0x1D478 => array(0x71)
1394
+					,0x1D479 => array(0x72), 0x1D47A => array(0x73), 0x1D47B => array(0x74)
1395
+					,0x1D47C => array(0x75), 0x1D47D => array(0x76), 0x1D47E => array(0x77)
1396
+					,0x1D47F => array(0x78), 0x1D480 => array(0x79), 0x1D481 => array(0x7A)
1397
+					,0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64)
1398
+					,0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B)
1399
+					,0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70)
1400
+					,0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74)
1401
+					,0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77)
1402
+					,0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A)
1403
+					,0x1D4D0 => array(0x61), 0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63)
1404
+					,0x1D4D3 => array(0x64), 0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66)
1405
+					,0x1D4D6 => array(0x67), 0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69)
1406
+					,0x1D4D9 => array(0x6A), 0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C)
1407
+					,0x1D4DC => array(0x6D), 0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F)
1408
+					,0x1D4DF => array(0x70), 0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72)
1409
+					,0x1D4E2 => array(0x73), 0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75)
1410
+					,0x1D4E5 => array(0x76), 0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78)
1411
+					,0x1D4E8 => array(0x79), 0x1D4E9 => array(0x7A), 0x1D504 => array(0x61)
1412
+					,0x1D505 => array(0x62), 0x1D507 => array(0x64), 0x1D508 => array(0x65)
1413
+					,0x1D509 => array(0x66), 0x1D50A => array(0x67), 0x1D50D => array(0x6A)
1414
+					,0x1D50E => array(0x6B), 0x1D50F => array(0x6C), 0x1D510 => array(0x6D)
1415
+					,0x1D511 => array(0x6E), 0x1D512 => array(0x6F), 0x1D513 => array(0x70)
1416
+					,0x1D514 => array(0x71), 0x1D516 => array(0x73), 0x1D517 => array(0x74)
1417
+					,0x1D518 => array(0x75), 0x1D519 => array(0x76), 0x1D51A => array(0x77)
1418
+					,0x1D51B => array(0x78), 0x1D51C => array(0x79), 0x1D538 => array(0x61)
1419
+					,0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65)
1420
+					,0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69)
1421
+					,0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C)
1422
+					,0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73)
1423
+					,0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76)
1424
+					,0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79)
1425
+					,0x1D56C => array(0x61), 0x1D56D => array(0x62), 0x1D56E => array(0x63)
1426
+					,0x1D56F => array(0x64), 0x1D570 => array(0x65), 0x1D571 => array(0x66)
1427
+					,0x1D572 => array(0x67), 0x1D573 => array(0x68), 0x1D574 => array(0x69)
1428
+					,0x1D575 => array(0x6A), 0x1D576 => array(0x6B), 0x1D577 => array(0x6C)
1429
+					,0x1D578 => array(0x6D), 0x1D579 => array(0x6E), 0x1D57A => array(0x6F)
1430
+					,0x1D57B => array(0x70), 0x1D57C => array(0x71), 0x1D57D => array(0x72)
1431
+					,0x1D57E => array(0x73), 0x1D57F => array(0x74), 0x1D580 => array(0x75)
1432
+					,0x1D581 => array(0x76), 0x1D582 => array(0x77), 0x1D583 => array(0x78)
1433
+					,0x1D584 => array(0x79), 0x1D585 => array(0x7A), 0x1D5A0 => array(0x61)
1434
+					,0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63), 0x1D5A3 => array(0x64)
1435
+					,0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66), 0x1D5A6 => array(0x67)
1436
+					,0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69), 0x1D5A9 => array(0x6A)
1437
+					,0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C), 0x1D5AC => array(0x6D)
1438
+					,0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F), 0x1D5AF => array(0x70)
1439
+					,0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72), 0x1D5B2 => array(0x73)
1440
+					,0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75), 0x1D5B5 => array(0x76)
1441
+					,0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78), 0x1D5B8 => array(0x79)
1442
+					,0x1D5B9 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62)
1443
+					,0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65)
1444
+					,0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68)
1445
+					,0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B)
1446
+					,0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E)
1447
+					,0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71)
1448
+					,0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74)
1449
+					,0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77)
1450
+					,0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A)
1451
+					,0x1D608 => array(0x61), 0x1D609 => array(0x62) ,0x1D60A => array(0x63)
1452
+					,0x1D60B => array(0x64), 0x1D60C => array(0x65), 0x1D60D => array(0x66)
1453
+					,0x1D60E => array(0x67), 0x1D60F => array(0x68), 0x1D610 => array(0x69)
1454
+					,0x1D611 => array(0x6A), 0x1D612 => array(0x6B), 0x1D613 => array(0x6C)
1455
+					,0x1D614 => array(0x6D), 0x1D615 => array(0x6E), 0x1D616 => array(0x6F)
1456
+					,0x1D617 => array(0x70), 0x1D618 => array(0x71), 0x1D619 => array(0x72)
1457
+					,0x1D61A => array(0x73), 0x1D61B => array(0x74), 0x1D61C => array(0x75)
1458
+					,0x1D61D => array(0x76), 0x1D61E => array(0x77), 0x1D61F => array(0x78)
1459
+					,0x1D620 => array(0x79), 0x1D621 => array(0x7A), 0x1D63C => array(0x61)
1460
+					,0x1D63D => array(0x62), 0x1D63E => array(0x63), 0x1D63F => array(0x64)
1461
+					,0x1D640 => array(0x65), 0x1D641 => array(0x66), 0x1D642 => array(0x67)
1462
+					,0x1D643 => array(0x68), 0x1D644 => array(0x69), 0x1D645 => array(0x6A)
1463
+					,0x1D646 => array(0x6B), 0x1D647 => array(0x6C), 0x1D648 => array(0x6D)
1464
+					,0x1D649 => array(0x6E), 0x1D64A => array(0x6F), 0x1D64B => array(0x70)
1465
+					,0x1D64C => array(0x71), 0x1D64D => array(0x72), 0x1D64E => array(0x73)
1466
+					,0x1D64F => array(0x74), 0x1D650 => array(0x75), 0x1D651 => array(0x76)
1467
+					,0x1D652 => array(0x77), 0x1D653 => array(0x78), 0x1D654 => array(0x79)
1468
+					,0x1D655 => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62)
1469
+					,0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65)
1470
+					,0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68)
1471
+					,0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B)
1472
+					,0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E)
1473
+					,0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71)
1474
+					,0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74)
1475
+					,0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77)
1476
+					,0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A)
1477
+					,0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2), 0x1D6AA => array(0x3B3)
1478
+					,0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5), 0x1D6AD => array(0x3B6)
1479
+					,0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8), 0x1D6B0 => array(0x3B9)
1480
+					,0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB), 0x1D6B3 => array(0x3BC)
1481
+					,0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE), 0x1D6B6 => array(0x3BF)
1482
+					,0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1), 0x1D6B9 => array(0x3B8)
1483
+					,0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4), 0x1D6BC => array(0x3C5)
1484
+					,0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7), 0x1D6BF => array(0x3C8)
1485
+					,0x1D6C0 => array(0x3C9), 0x1D6D3 => array(0x3C3), 0x1D6E2 => array(0x3B1)
1486
+					,0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4)
1487
+					,0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7)
1488
+					,0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA)
1489
+					,0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD)
1490
+					,0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0)
1491
+					,0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8) ,0x1D6F4 => array(0x3C3)
1492
+					,0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6)
1493
+					,0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8) ,0x1D6FA => array(0x3C9)
1494
+					,0x1D70D => array(0x3C3), 0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2)
1495
+					,0x1D71E => array(0x3B3), 0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5)
1496
+					,0x1D721 => array(0x3B6), 0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8)
1497
+					,0x1D724 => array(0x3B9), 0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB)
1498
+					,0x1D727 => array(0x3BC), 0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE)
1499
+					,0x1D72A => array(0x3BF), 0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1)
1500
+					,0x1D72D => array(0x3B8), 0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4)
1501
+					,0x1D730 => array(0x3C5), 0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7)
1502
+					,0x1D733 => array(0x3C8), 0x1D734 => array(0x3C9), 0x1D747 => array(0x3C3)
1503
+					,0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2), 0x1D758 => array(0x3B3)
1504
+					,0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5), 0x1D75B => array(0x3B6)
1505
+					,0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8), 0x1D75E => array(0x3B9)
1506
+					,0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB), 0x1D761 => array(0x3BC)
1507
+					,0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE), 0x1D764 => array(0x3BF)
1508
+					,0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1), 0x1D767 => array(0x3B8)
1509
+					,0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4), 0x1D76A => array(0x3C5)
1510
+					,0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7), 0x1D76D => array(0x3C8)
1511
+					,0x1D76E => array(0x3C9), 0x1D781 => array(0x3C3), 0x1D790 => array(0x3B1)
1512
+					,0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4)
1513
+					,0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7)
1514
+					,0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA)
1515
+					,0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD)
1516
+					,0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0)
1517
+					,0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3)
1518
+					,0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6)
1519
+					,0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9)
1520
+					,0x1D7BB => array(0x3C3), 0x3F9   => array(0x3C3), 0x1D2C  => array(0x61)
1521
+					,0x1D2D  => array(0xE6), 0x1D2E  => array(0x62), 0x1D30  => array(0x64)
1522
+					,0x1D31  => array(0x65), 0x1D32  => array(0x1DD), 0x1D33  => array(0x67)
1523
+					,0x1D34  => array(0x68), 0x1D35  => array(0x69), 0x1D36  => array(0x6A)
1524
+					,0x1D37  => array(0x6B), 0x1D38  => array(0x6C), 0x1D39  => array(0x6D)
1525
+					,0x1D3A  => array(0x6E), 0x1D3C  => array(0x6F), 0x1D3D  => array(0x223)
1526
+					,0x1D3E  => array(0x70), 0x1D3F  => array(0x72), 0x1D40  => array(0x74)
1527
+					,0x1D41  => array(0x75), 0x1D42  => array(0x77), 0x213B  => array(0x66, 0x61, 0x78)
1528
+					,0x3250  => array(0x70, 0x74, 0x65), 0x32CC  => array(0x68, 0x67)
1529
+					,0x32CE  => array(0x65, 0x76), 0x32CF  => array(0x6C, 0x74, 0x64)
1530
+					,0x337A  => array(0x69, 0x75), 0x33DE  => array(0x76, 0x2215, 0x6D)
1531
+					,0x33DF  => array(0x61, 0x2215, 0x6D)
1532
+					)
1533
+			,'norm_combcls' => array(0x334   => 1,   0x335   => 1,   0x336   => 1,   0x337   => 1
1534
+					,0x338   => 1,   0x93C   => 7,   0x9BC   => 7,   0xA3C   => 7,   0xABC   => 7
1535
+					,0xB3C   => 7,   0xCBC   => 7,   0x1037  => 7,   0x3099  => 8,   0x309A  => 8
1536
+					,0x94D   => 9,   0x9CD   => 9,   0xA4D   => 9,   0xACD   => 9,   0xB4D   => 9
1537
+					,0xBCD   => 9,   0xC4D   => 9,   0xCCD   => 9,   0xD4D   => 9,   0xDCA   => 9
1538
+					,0xE3A   => 9,   0xF84   => 9,   0x1039  => 9,   0x1714  => 9,   0x1734  => 9
1539
+					,0x17D2  => 9,   0x5B0   => 10,  0x5B1   => 11,  0x5B2   => 12,  0x5B3   => 13
1540
+					,0x5B4   => 14,  0x5B5   => 15,  0x5B6   => 16,  0x5B7   => 17,  0x5B8   => 18
1541
+					,0x5B9   => 19,  0x5BB   => 20,  0x5Bc   => 21,  0x5BD   => 22,  0x5BF   => 23
1542
+					,0x5C1   => 24,  0x5C2   => 25,  0xFB1E  => 26,  0x64B   => 27,  0x64C   => 28
1543
+					,0x64D   => 29,  0x64E   => 30,  0x64F   => 31,  0x650   => 32,  0x651   => 33
1544
+					,0x652   => 34,  0x670   => 35,  0x711   => 36,  0xC55   => 84,  0xC56   => 91
1545
+					,0xE38   => 103, 0xE39   => 103, 0xE48   => 107, 0xE49   => 107, 0xE4A   => 107
1546
+					,0xE4B   => 107, 0xEB8   => 118, 0xEB9   => 118, 0xEC8   => 122, 0xEC9   => 122
1547
+					,0xECA   => 122, 0xECB   => 122, 0xF71   => 129, 0xF72   => 130, 0xF7A   => 130
1548
+					,0xF7B   => 130, 0xF7C   => 130, 0xF7D   => 130, 0xF80   => 130, 0xF74   => 132
1549
+					,0x321   => 202, 0x322   => 202, 0x327   => 202, 0x328   => 202, 0x31B   => 216
1550
+					,0xF39   => 216, 0x1D165 => 216, 0x1D166 => 216, 0x1D16E => 216, 0x1D16F => 216
1551
+					,0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216, 0x302A  => 218, 0x316   => 220
1552
+					,0x317   => 220, 0x318   => 220, 0x319   => 220, 0x31C   => 220, 0x31D   => 220
1553
+					,0x31E   => 220, 0x31F   => 220, 0x320   => 220, 0x323   => 220, 0x324   => 220
1554
+					,0x325   => 220, 0x326   => 220, 0x329   => 220, 0x32A   => 220, 0x32B   => 220
1555
+					,0x32C   => 220, 0x32D   => 220, 0x32E   => 220, 0x32F   => 220, 0x330   => 220
1556
+					,0x331   => 220, 0x332   => 220, 0x333   => 220, 0x339   => 220, 0x33A   => 220
1557
+					,0x33B   => 220, 0x33C   => 220, 0x347   => 220, 0x348   => 220, 0x349   => 220
1558
+					,0x34D   => 220, 0x34E   => 220, 0x353   => 220, 0x354   => 220, 0x355   => 220
1559
+					,0x356   => 220, 0x591   => 220, 0x596   => 220, 0x59B   => 220, 0x5A3   => 220
1560
+					,0x5A4   => 220, 0x5A5   => 220, 0x5A6   => 220, 0x5A7   => 220, 0x5AA   => 220
1561
+					,0x655   => 220, 0x656   => 220, 0x6E3   => 220, 0x6EA   => 220, 0x6ED   => 220
1562
+					,0x731   => 220, 0x734   => 220, 0x737   => 220, 0x738   => 220, 0x739   => 220
1563
+					,0x73B   => 220, 0x73C   => 220, 0x73E   => 220, 0x742   => 220, 0x744   => 220
1564
+					,0x746   => 220, 0x748   => 220, 0x952   => 220, 0xF18   => 220, 0xF19   => 220
1565
+					,0xF35   => 220, 0xF37   => 220, 0xFC6   => 220, 0x193B  => 220, 0x20E8  => 220
1566
+					,0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220
1567
+					,0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220
1568
+					,0x59A   => 222, 0x5AD   => 222, 0x1929  => 222, 0x302D  => 222, 0x302E  => 224
1569
+					,0x302F  => 224, 0x1D16D => 226, 0x5AE   => 228, 0x18A9  => 228, 0x302B  => 228
1570
+					,0x300   => 230, 0x301   => 230, 0x302   => 230, 0x303   => 230, 0x304   => 230
1571
+					,0x305   => 230, 0x306   => 230, 0x307   => 230, 0x308   => 230, 0x309   => 230
1572
+					,0x30A   => 230, 0x30B   => 230, 0x30C   => 230, 0x30D   => 230, 0x30E   => 230
1573
+					,0x30F   => 230, 0x310   => 230, 0x311   => 230, 0x312   => 230, 0x313   => 230
1574
+					,0x314   => 230, 0x33D   => 230, 0x33E   => 230, 0x33F   => 230, 0x340   => 230
1575
+					,0x341   => 230, 0x342   => 230, 0x343   => 230, 0x344   => 230, 0x346   => 230
1576
+					,0x34A   => 230, 0x34B   => 230, 0x34C   => 230, 0x350   => 230, 0x351   => 230
1577
+					,0x352   => 230, 0x357   => 230, 0x363   => 230, 0x364   => 230, 0x365   => 230
1578
+					,0x366   => 230, 0x367   => 230, 0x368   => 230, 0x369   => 230, 0x36A   => 230
1579
+					,0x36B   => 230, 0x36C   => 230, 0x36D   => 230, 0x36E   => 230, 0x36F   => 230
1580
+					,0x483   => 230, 0x484   => 230, 0x485   => 230, 0x486   => 230, 0x592   => 230
1581
+					,0x593   => 230, 0x594   => 230, 0x595   => 230, 0x597   => 230, 0x598   => 230
1582
+					,0x599   => 230, 0x59C   => 230, 0x59D   => 230, 0x59E   => 230, 0x59F   => 230
1583
+					,0x5A0   => 230, 0x5A1   => 230, 0x5A8   => 230, 0x5A9   => 230, 0x5AB   => 230
1584
+					,0x5AC   => 230, 0x5AF   => 230, 0x5C4   => 230, 0x610   => 230, 0x611   => 230
1585
+					,0x612   => 230, 0x613   => 230, 0x614   => 230, 0x615   => 230, 0x653   => 230
1586
+					,0x654   => 230, 0x657   => 230, 0x658   => 230, 0x6D6   => 230, 0x6D7   => 230
1587
+					,0x6D8   => 230, 0x6D9   => 230, 0x6DA   => 230, 0x6DB   => 230, 0x6DC   => 230
1588
+					,0x6DF   => 230, 0x6E0   => 230, 0x6E1   => 230, 0x6E2   => 230, 0x6E4   => 230
1589
+					,0x6E7   => 230, 0x6E8   => 230, 0x6EB   => 230, 0x6EC   => 230, 0x730   => 230
1590
+					,0x732   => 230, 0x733   => 230, 0x735   => 230, 0x736   => 230, 0x73A   => 230
1591
+					,0x73D   => 230, 0x73F   => 230, 0x740   => 230, 0x741   => 230, 0x743   => 230
1592
+					,0x745   => 230, 0x747   => 230, 0x749   => 230, 0x74A   => 230, 0x951   => 230
1593
+					,0x953   => 230, 0x954   => 230, 0xF82   => 230, 0xF83   => 230, 0xF86   => 230
1594
+					,0xF87   => 230, 0x170D  => 230, 0x193A  => 230, 0x20D0  => 230, 0x20D1  => 230
1595
+					,0x20D4  => 230, 0x20D5  => 230, 0x20D6  => 230, 0x20D7  => 230, 0x20DB  => 230
1596
+					,0x20DC  => 230, 0x20E1  => 230, 0x20E7  => 230, 0x20E9  => 230, 0xFE20  => 230
1597
+					,0xFE21  => 230, 0xFE22  => 230, 0xFE23  => 230, 0x1D185 => 230, 0x1D186 => 230
1598
+					,0x1D187 => 230, 0x1D189 => 230, 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230
1599
+					,0x1D1AC => 230, 0x1D1AD => 230, 0x315   => 232, 0x31A   => 232, 0x302C  => 232
1600
+					,0x35F   => 233, 0x362   => 233, 0x35D   => 234, 0x35E   => 234, 0x360   => 234
1601
+					,0x361   => 234, 0x345   => 240
1602
+					)
1603
+			);
1604 1604
 }
1605 1605
 ?>
1606 1606
\ No newline at end of file
Please login to merge, or discard this patch.
phpgwapi/inc/idna_convert/example.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -8,22 +8,22 @@
 block discarded – undo
8 8
 
9 9
 $version_select = '<select size="1" name="idn_version"><option value="2003">IDNA 2003</option><option value="2008"';
10 10
 if ($idn_version == 2008) {
11
-    $version_select .= ' selected="selected"';
11
+	$version_select .= ' selected="selected"';
12 12
 }
13 13
 $version_select .= '>IDNA 2008</option></select>';
14 14
 
15 15
 if (isset($_REQUEST['encode'])) {
16
-    $decoded = isset($_REQUEST['decoded']) ? stripslashes($_REQUEST['decoded']) : '';
17
-    $encoded = $IDN->encode($decoded);
16
+	$decoded = isset($_REQUEST['decoded']) ? stripslashes($_REQUEST['decoded']) : '';
17
+	$encoded = $IDN->encode($decoded);
18 18
 }
19 19
 if (isset($_REQUEST['decode'])) {
20
-    $encoded = isset($_REQUEST['encoded']) ? stripslashes($_REQUEST['encoded']) : '';
21
-    $decoded = $IDN->decode($encoded);
20
+	$encoded = isset($_REQUEST['encoded']) ? stripslashes($_REQUEST['encoded']) : '';
21
+	$decoded = $IDN->decode($encoded);
22 22
 }
23 23
 $lang = 'en';
24 24
 if (isset($_REQUEST['lang'])) {
25
-    if ('de' == $_REQUEST['lang'] || 'en' == $_REQUEST['lang']) $lang = $_REQUEST['lang'];
26
-    $add .= '<input type="hidden" name="lang" value="'.$_REQUEST['lang'].'" />'."\n";
25
+	if ('de' == $_REQUEST['lang'] || 'en' == $_REQUEST['lang']) $lang = $_REQUEST['lang'];
26
+	$add .= '<input type="hidden" name="lang" value="'.$_REQUEST['lang'].'" />'."\n";
27 27
 }
28 28
 ?>
29 29
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Please login to merge, or discard this patch.
phpgwapi/inc/idna_convert/uctc.php 1 patch
Indentation   +266 added lines, -266 removed lines patch added patch discarded remove patch
@@ -16,285 +16,285 @@
 block discarded – undo
16 16
  * @version 0.0.6 2009-05-10
17 17
  */
18 18
 class uctc {
19
-    private static $mechs = array('ucs4', /*'ucs4le', 'ucs4be', */'ucs4array', /*'utf16', 'utf16le', 'utf16be', */'utf8', 'utf7', 'utf7imap');
20
-    private static $allow_overlong = false;
21
-    private static $safe_mode;
22
-    private static $safe_char;
19
+	private static $mechs = array('ucs4', /*'ucs4le', 'ucs4be', */'ucs4array', /*'utf16', 'utf16le', 'utf16be', */'utf8', 'utf7', 'utf7imap');
20
+	private static $allow_overlong = false;
21
+	private static $safe_mode;
22
+	private static $safe_char;
23 23
 
24
-    /**
25
-     * The actual conversion routine
26
-     *
27
-     * @param mixed $data  The data to convert, usually a string, array when converting from UCS-4 array
28
-     * @param string $from  Original encoding of the data
29
-     * @param string $to  Target encoding of the data
30
-     * @param bool $safe_mode  SafeMode tries to correct invalid codepoints
31
-     * @return mixed  False on failure, String or array on success, depending on target encoding
32
-     * @access public
33
-     * @since 0.0.1
34
-     */
35
-    public static function convert($data, $from, $to, $safe_mode = false, $safe_char = 0xFFFC)
36
-    {
37
-        self::$safe_mode = ($safe_mode) ? true : false;
38
-        self::$safe_char = ($safe_char) ? $safe_char : 0xFFFC;
39
-        if (self::$safe_mode) self::$allow_overlong = true;
40
-        if (!in_array($from, self::$mechs)) throw new Exception('Invalid input format specified');
41
-        if (!in_array($to, self::$mechs)) throw new Exception('Invalid output format specified');
42
-        if ($from != 'ucs4array') eval('$data = self::'.$from.'_ucs4array($data);');
43
-        if ($to != 'ucs4array') eval('$data = self::ucs4array_'.$to.'($data);');
44
-        return $data;
45
-    }
24
+	/**
25
+	 * The actual conversion routine
26
+	 *
27
+	 * @param mixed $data  The data to convert, usually a string, array when converting from UCS-4 array
28
+	 * @param string $from  Original encoding of the data
29
+	 * @param string $to  Target encoding of the data
30
+	 * @param bool $safe_mode  SafeMode tries to correct invalid codepoints
31
+	 * @return mixed  False on failure, String or array on success, depending on target encoding
32
+	 * @access public
33
+	 * @since 0.0.1
34
+	 */
35
+	public static function convert($data, $from, $to, $safe_mode = false, $safe_char = 0xFFFC)
36
+	{
37
+		self::$safe_mode = ($safe_mode) ? true : false;
38
+		self::$safe_char = ($safe_char) ? $safe_char : 0xFFFC;
39
+		if (self::$safe_mode) self::$allow_overlong = true;
40
+		if (!in_array($from, self::$mechs)) throw new Exception('Invalid input format specified');
41
+		if (!in_array($to, self::$mechs)) throw new Exception('Invalid output format specified');
42
+		if ($from != 'ucs4array') eval('$data = self::'.$from.'_ucs4array($data);');
43
+		if ($to != 'ucs4array') eval('$data = self::ucs4array_'.$to.'($data);');
44
+		return $data;
45
+	}
46 46
 
47
-    /**
48
-     * This converts an UTF-8 encoded string to its UCS-4 representation
49
-     *
50
-     * @param string $input  The UTF-8 string to convert
51
-     * @return array  Array of 32bit values representing each codepoint
52
-     * @access private
53
-     */
54
-    private static function utf8_ucs4array($input)
55
-    {
56
-        $output = array();
57
-        $out_len = 0;
58
-        $inp_len = strlen($input);
59
-        $mode = 'next';
60
-        $test = 'none';
61
-        for ($k = 0; $k < $inp_len; ++$k) {
62
-            $v = ord($input{$k}); // Extract byte from input string
47
+	/**
48
+	 * This converts an UTF-8 encoded string to its UCS-4 representation
49
+	 *
50
+	 * @param string $input  The UTF-8 string to convert
51
+	 * @return array  Array of 32bit values representing each codepoint
52
+	 * @access private
53
+	 */
54
+	private static function utf8_ucs4array($input)
55
+	{
56
+		$output = array();
57
+		$out_len = 0;
58
+		$inp_len = strlen($input);
59
+		$mode = 'next';
60
+		$test = 'none';
61
+		for ($k = 0; $k < $inp_len; ++$k) {
62
+			$v = ord($input{$k}); // Extract byte from input string
63 63
 
64
-            if ($v < 128) { // We found an ASCII char - put into stirng as is
65
-                $output[$out_len] = $v;
66
-                ++$out_len;
67
-                if ('add' == $mode) {
68
-                    if (self::$safe_mode) {
69
-                        $output[$out_len-2] = self::$safe_char;
70
-                        $mode = 'next';
71
-                    } else {
72
-                        throw new Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
73
-                    }
74
-                }
75
-                continue;
76
-            }
77
-            if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
78
-                $start_byte = $v;
79
-                $mode = 'add';
80
-                $test = 'range';
81
-                if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
82
-                    $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
83
-                    $v = ($v - 192) << 6;
84
-                } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
85
-                    $next_byte = 1;
86
-                    $v = ($v - 224) << 12;
87
-                } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
88
-                    $next_byte = 2;
89
-                    $v = ($v - 240) << 18;
90
-                } elseif (self::$safe_mode) {
91
-                    $mode = 'next';
92
-                    $output[$out_len] = self::$safe_char;
93
-                    ++$out_len;
94
-                    continue;
95
-                } else {
96
-                    throw new Exception('This might be UTF-8, but I don\'t understand it at byte '.$k);
97
-                }
98
-                if ($inp_len-$k-$next_byte < 2) {
99
-                    $output[$out_len] = self::$safe_char;
100
-                    $mode = 'no';
101
-                    continue;
102
-                }
64
+			if ($v < 128) { // We found an ASCII char - put into stirng as is
65
+				$output[$out_len] = $v;
66
+				++$out_len;
67
+				if ('add' == $mode) {
68
+					if (self::$safe_mode) {
69
+						$output[$out_len-2] = self::$safe_char;
70
+						$mode = 'next';
71
+					} else {
72
+						throw new Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
73
+					}
74
+				}
75
+				continue;
76
+			}
77
+			if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
78
+				$start_byte = $v;
79
+				$mode = 'add';
80
+				$test = 'range';
81
+				if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
82
+					$next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
83
+					$v = ($v - 192) << 6;
84
+				} elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
85
+					$next_byte = 1;
86
+					$v = ($v - 224) << 12;
87
+				} elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
88
+					$next_byte = 2;
89
+					$v = ($v - 240) << 18;
90
+				} elseif (self::$safe_mode) {
91
+					$mode = 'next';
92
+					$output[$out_len] = self::$safe_char;
93
+					++$out_len;
94
+					continue;
95
+				} else {
96
+					throw new Exception('This might be UTF-8, but I don\'t understand it at byte '.$k);
97
+				}
98
+				if ($inp_len-$k-$next_byte < 2) {
99
+					$output[$out_len] = self::$safe_char;
100
+					$mode = 'no';
101
+					continue;
102
+				}
103 103
 
104
-                if ('add' == $mode) {
105
-                    $output[$out_len] = (int) $v;
106
-                    ++$out_len;
107
-                    continue;
108
-                }
109
-            }
110
-            if ('add' == $mode) {
111
-                if (!self::$allow_overlong && $test == 'range') {
112
-                    $test = 'none';
113
-                    if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
114
-                        throw new Exception('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
115
-                    }
116
-                }
117
-                if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
118
-                    $v = ($v-128) << ($next_byte*6);
119
-                    $output[($out_len-1)] += $v;
120
-                    --$next_byte;
121
-                } else {
122
-                    if (self::$safe_mode) {
123
-                        $output[$out_len-1] = ord(self::$safe_char);
124
-                        $k--;
125
-                        $mode = 'next';
126
-                        continue;
127
-                    } else {
128
-                        throw new Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
129
-                    }
130
-                }
131
-                if ($next_byte < 0) {
132
-                    $mode = 'next';
133
-                }
134
-            }
135
-        } // for
136
-        return $output;
137
-    }
104
+				if ('add' == $mode) {
105
+					$output[$out_len] = (int) $v;
106
+					++$out_len;
107
+					continue;
108
+				}
109
+			}
110
+			if ('add' == $mode) {
111
+				if (!self::$allow_overlong && $test == 'range') {
112
+					$test = 'none';
113
+					if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
114
+						throw new Exception('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
115
+					}
116
+				}
117
+				if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
118
+					$v = ($v-128) << ($next_byte*6);
119
+					$output[($out_len-1)] += $v;
120
+					--$next_byte;
121
+				} else {
122
+					if (self::$safe_mode) {
123
+						$output[$out_len-1] = ord(self::$safe_char);
124
+						$k--;
125
+						$mode = 'next';
126
+						continue;
127
+					} else {
128
+						throw new Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
129
+					}
130
+				}
131
+				if ($next_byte < 0) {
132
+					$mode = 'next';
133
+				}
134
+			}
135
+		} // for
136
+		return $output;
137
+	}
138 138
 
139
-    /**
140
-     * Convert UCS-4 string into UTF-8 string
141
-     * See utf8_ucs4array() for details
142
-     * @access   private
143
-     */
144
-    private static function ucs4array_utf8($input)
145
-    {
146
-        $output = '';
147
-        foreach ($input as $v) {
148
-            if ($v < 128) { // 7bit are transferred literally
149
-                $output .= chr($v);
150
-            } elseif ($v < (1 << 11)) { // 2 bytes
151
-                $output .= chr(192+($v >> 6)).chr(128+($v & 63));
152
-            } elseif ($v < (1 << 16)) { // 3 bytes
153
-                $output .= chr(224+($v >> 12)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
154
-            } elseif ($v < (1 << 21)) { // 4 bytes
155
-                $output .= chr(240+($v >> 18)).chr(128+(($v >> 12) & 63)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
156
-            } elseif (self::$safe_mode) {
157
-                $output .= self::$safe_char;
158
-            } else {
159
-                throw new Exception('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
160
-            }
161
-        }
162
-        return $output;
163
-    }
139
+	/**
140
+	 * Convert UCS-4 string into UTF-8 string
141
+	 * See utf8_ucs4array() for details
142
+	 * @access   private
143
+	 */
144
+	private static function ucs4array_utf8($input)
145
+	{
146
+		$output = '';
147
+		foreach ($input as $v) {
148
+			if ($v < 128) { // 7bit are transferred literally
149
+				$output .= chr($v);
150
+			} elseif ($v < (1 << 11)) { // 2 bytes
151
+				$output .= chr(192+($v >> 6)).chr(128+($v & 63));
152
+			} elseif ($v < (1 << 16)) { // 3 bytes
153
+				$output .= chr(224+($v >> 12)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
154
+			} elseif ($v < (1 << 21)) { // 4 bytes
155
+				$output .= chr(240+($v >> 18)).chr(128+(($v >> 12) & 63)).chr(128+(($v >> 6) & 63)).chr(128+($v & 63));
156
+			} elseif (self::$safe_mode) {
157
+				$output .= self::$safe_char;
158
+			} else {
159
+				throw new Exception('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k);
160
+			}
161
+		}
162
+		return $output;
163
+	}
164 164
 
165
-    private static function utf7imap_ucs4array($input)
166
-    {
167
-        return self::utf7_ucs4array(str_replace(',', '/', $input), '&');
168
-    }
165
+	private static function utf7imap_ucs4array($input)
166
+	{
167
+		return self::utf7_ucs4array(str_replace(',', '/', $input), '&');
168
+	}
169 169
 
170
-    private static function utf7_ucs4array($input, $sc = '+')
171
-    {
172
-        $output  = array();
173
-        $out_len = 0;
174
-        $inp_len = strlen($input);
175
-        $mode    = 'd';
176
-        $b64     = '';
170
+	private static function utf7_ucs4array($input, $sc = '+')
171
+	{
172
+		$output  = array();
173
+		$out_len = 0;
174
+		$inp_len = strlen($input);
175
+		$mode    = 'd';
176
+		$b64     = '';
177 177
 
178
-        for ($k = 0; $k < $inp_len; ++$k) {
179
-            $c = $input{$k};
180
-            if (0 == ord($c)) continue; // Ignore zero bytes
181
-            if ('b' == $mode) {
182
-                // Sequence got terminated
183
-                if (!preg_match('![A-Za-z0-9/'.preg_quote($sc, '!').']!', $c)) {
184
-                    if ('-' == $c) {
185
-                        if ($b64 == '') {
186
-                            $output[$out_len] = ord($sc);
187
-                            $out_len++;
188
-                            $mode = 'd';
189
-                            continue;
190
-                        }
191
-                    }
192
-                    $tmp = base64_decode($b64);
193
-                    $tmp = substr($tmp, -1 * (strlen($tmp) % 2));
194
-                    for ($i = 0; $i < strlen($tmp); $i++) {
195
-                        if ($i % 2) {
196
-                            $output[$out_len] += ord($tmp{$i});
197
-                            $out_len++;
198
-                        } else {
199
-                            $output[$out_len] = ord($tmp{$i}) << 8;
200
-                        }
201
-                    }
202
-                    $mode = 'd';
203
-                    $b64 = '';
204
-                    continue;
205
-                } else {
206
-                    $b64 .= $c;
207
-                }
208
-            }
209
-            if ('d' == $mode) {
210
-                if ($sc == $c) {
211
-                    $mode = 'b';
212
-                    continue;
213
-                }
214
-                $output[$out_len] = ord($c);
215
-                $out_len++;
216
-            }
217
-        }
218
-        return $output;
219
-    }
178
+		for ($k = 0; $k < $inp_len; ++$k) {
179
+			$c = $input{$k};
180
+			if (0 == ord($c)) continue; // Ignore zero bytes
181
+			if ('b' == $mode) {
182
+				// Sequence got terminated
183
+				if (!preg_match('![A-Za-z0-9/'.preg_quote($sc, '!').']!', $c)) {
184
+					if ('-' == $c) {
185
+						if ($b64 == '') {
186
+							$output[$out_len] = ord($sc);
187
+							$out_len++;
188
+							$mode = 'd';
189
+							continue;
190
+						}
191
+					}
192
+					$tmp = base64_decode($b64);
193
+					$tmp = substr($tmp, -1 * (strlen($tmp) % 2));
194
+					for ($i = 0; $i < strlen($tmp); $i++) {
195
+						if ($i % 2) {
196
+							$output[$out_len] += ord($tmp{$i});
197
+							$out_len++;
198
+						} else {
199
+							$output[$out_len] = ord($tmp{$i}) << 8;
200
+						}
201
+					}
202
+					$mode = 'd';
203
+					$b64 = '';
204
+					continue;
205
+				} else {
206
+					$b64 .= $c;
207
+				}
208
+			}
209
+			if ('d' == $mode) {
210
+				if ($sc == $c) {
211
+					$mode = 'b';
212
+					continue;
213
+				}
214
+				$output[$out_len] = ord($c);
215
+				$out_len++;
216
+			}
217
+		}
218
+		return $output;
219
+	}
220 220
 
221
-    private static function ucs4array_utf7imap($input)
222
-    {
223
-        return str_replace('/', ',', self::ucs4array_utf7($input, '&'));
224
-    }
221
+	private static function ucs4array_utf7imap($input)
222
+	{
223
+		return str_replace('/', ',', self::ucs4array_utf7($input, '&'));
224
+	}
225 225
 
226
-    private static function ucs4array_utf7($input, $sc = '+')
227
-    {
228
-        $output = '';
229
-        $mode = 'd';
230
-        $b64 = '';
231
-        while (true) {
232
-            $v = (!empty($input)) ? array_shift($input) : false;
233
-            $is_direct = (false !== $v) ? (0x20 <= $v && $v <= 0x7e && $v != ord($sc)) : true;
234
-            if ($mode == 'b') {
235
-                if ($is_direct) {
236
-                    if ($b64 == chr(0).$sc) {
237
-                        $output .= $sc.'-';
238
-                        $b64 = '';
239
-                    } elseif ($b64) {
240
-                        $output .= $sc.str_replace('=', '', base64_encode($b64)).'-';
241
-                        $b64 = '';
242
-                    }
243
-                    $mode = 'd';
244
-                } elseif (false !== $v) {
245
-                    $b64 .= chr(($v >> 8) & 255). chr($v & 255);
246
-                }
247
-            }
248
-            if ($mode == 'd' && false !== $v) {
249
-                if ($is_direct) {
250
-                    $output .= chr($v);
251
-                } else {
252
-                    $b64 = chr(($v >> 8) & 255). chr($v & 255);
253
-                    $mode = 'b';
254
-                }
255
-            }
256
-            if (false === $v && $b64 == '') break;
257
-        }
258
-        return $output;
259
-    }
226
+	private static function ucs4array_utf7($input, $sc = '+')
227
+	{
228
+		$output = '';
229
+		$mode = 'd';
230
+		$b64 = '';
231
+		while (true) {
232
+			$v = (!empty($input)) ? array_shift($input) : false;
233
+			$is_direct = (false !== $v) ? (0x20 <= $v && $v <= 0x7e && $v != ord($sc)) : true;
234
+			if ($mode == 'b') {
235
+				if ($is_direct) {
236
+					if ($b64 == chr(0).$sc) {
237
+						$output .= $sc.'-';
238
+						$b64 = '';
239
+					} elseif ($b64) {
240
+						$output .= $sc.str_replace('=', '', base64_encode($b64)).'-';
241
+						$b64 = '';
242
+					}
243
+					$mode = 'd';
244
+				} elseif (false !== $v) {
245
+					$b64 .= chr(($v >> 8) & 255). chr($v & 255);
246
+				}
247
+			}
248
+			if ($mode == 'd' && false !== $v) {
249
+				if ($is_direct) {
250
+					$output .= chr($v);
251
+				} else {
252
+					$b64 = chr(($v >> 8) & 255). chr($v & 255);
253
+					$mode = 'b';
254
+				}
255
+			}
256
+			if (false === $v && $b64 == '') break;
257
+		}
258
+		return $output;
259
+	}
260 260
 
261
-    /**
262
-     * Convert UCS-4 array into UCS-4 string (Little Endian at the moment)
263
-     * @access   private
264
-     */
265
-    private static function ucs4array_ucs4($input)
266
-    {
267
-        $output = '';
268
-        foreach ($input as $v) {
269
-            $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
270
-        }
271
-        return $output;
272
-    }
261
+	/**
262
+	 * Convert UCS-4 array into UCS-4 string (Little Endian at the moment)
263
+	 * @access   private
264
+	 */
265
+	private static function ucs4array_ucs4($input)
266
+	{
267
+		$output = '';
268
+		foreach ($input as $v) {
269
+			$output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
270
+		}
271
+		return $output;
272
+	}
273 273
 
274
-    /**
275
-     * Convert UCS-4 string (LE in the moment) into UCS-4 garray
276
-     * @access   private
277
-     */
278
-    private static function ucs4_ucs4array($input)
279
-    {
280
-        $output = array();
274
+	/**
275
+	 * Convert UCS-4 string (LE in the moment) into UCS-4 garray
276
+	 * @access   private
277
+	 */
278
+	private static function ucs4_ucs4array($input)
279
+	{
280
+		$output = array();
281 281
 
282
-        $inp_len = strlen($input);
283
-        // Input length must be dividable by 4
284
-        if ($inp_len % 4) {
285
-            throw new Exception('Input UCS4 string is broken');
286
-        }
287
-        // Empty input - return empty output
288
-        if (!$inp_len) return $output;
282
+		$inp_len = strlen($input);
283
+		// Input length must be dividable by 4
284
+		if ($inp_len % 4) {
285
+			throw new Exception('Input UCS4 string is broken');
286
+		}
287
+		// Empty input - return empty output
288
+		if (!$inp_len) return $output;
289 289
 
290
-        for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
291
-            if (!($i % 4)) { // Increment output position every 4 input bytes
292
-                $out_len++;
293
-                $output[$out_len] = 0;
294
-            }
295
-            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
296
-        }
297
-        return $output;
298
-    }
290
+		for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
291
+			if (!($i % 4)) { // Increment output position every 4 input bytes
292
+				$out_len++;
293
+				$output[$out_len] = 0;
294
+			}
295
+			$output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
296
+		}
297
+		return $output;
298
+	}
299 299
 }
300 300
 ?>
301 301
\ No newline at end of file
Please login to merge, or discard this patch.
phpgwapi/inc/class.global_stream_wrapper.inc.php 1 patch
Indentation   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -23,68 +23,68 @@  discard block
 block discarded – undo
23 23
  */
24 24
 class global_stream_wrapper
25 25
 {
26
-    private $pos;
27
-    private $stream;
28
-    private $name;
26
+	private $pos;
27
+	private $stream;
28
+	private $name;
29 29
 
30
-    public function stream_open($path, $mode, $options, &$opened_path)
31
-    {
32
-        $this->stream = &$GLOBALS[$this->name=egw_vfs::parse_url($path,PHP_URL_HOST)];
33
-        $this->pos = 0;
34
-        if (!is_string($this->stream)) return false;
35
-        return true;
36
-    }
30
+	public function stream_open($path, $mode, $options, &$opened_path)
31
+	{
32
+		$this->stream = &$GLOBALS[$this->name=egw_vfs::parse_url($path,PHP_URL_HOST)];
33
+		$this->pos = 0;
34
+		if (!is_string($this->stream)) return false;
35
+		return true;
36
+	}
37 37
 
38
-    public function stream_read($count)
39
-    {
40
-        $ret = self::_cut_bytes($this->stream, $this->pos, $count);
41
-    	//error_log(__METHOD__."($count) this->pos=$this->pos, self::_bytes(this->stream)=".self::_bytes($this->stream)." self::_bytes(ret)=".self::_bytes($ret));
42
-        $this->pos += self::_bytes($ret);
43
-        return $ret;
44
-    }
38
+	public function stream_read($count)
39
+	{
40
+		$ret = self::_cut_bytes($this->stream, $this->pos, $count);
41
+		//error_log(__METHOD__."($count) this->pos=$this->pos, self::_bytes(this->stream)=".self::_bytes($this->stream)." self::_bytes(ret)=".self::_bytes($ret));
42
+		$this->pos += self::_bytes($ret);
43
+		return $ret;
44
+	}
45 45
 
46
-    public function stream_write($data)
47
-    {
48
-        $l=self::_bytes($data);
49
-        $this->stream =
50
-            self::_cut_bytes($this->stream, 0, $this->pos) .
51
-            $data .
52
-            self::_cut_bytes($this->stream, $this->pos += $l);
53
-        return $l;
54
-    }
46
+	public function stream_write($data)
47
+	{
48
+		$l=self::_bytes($data);
49
+		$this->stream =
50
+			self::_cut_bytes($this->stream, 0, $this->pos) .
51
+			$data .
52
+			self::_cut_bytes($this->stream, $this->pos += $l);
53
+		return $l;
54
+	}
55 55
 
56
-    public function stream_tell()
57
-    {
58
-        return $this->pos;
59
-    }
56
+	public function stream_tell()
57
+	{
58
+		return $this->pos;
59
+	}
60 60
 
61
-    public function stream_eof()
62
-    {
63
-        return $this->pos >= self::_bytes($this->stream);
64
-    }
61
+	public function stream_eof()
62
+	{
63
+		return $this->pos >= self::_bytes($this->stream);
64
+	}
65 65
 
66
-    public function stream_seek($offset, $whence)
67
-    {
68
-        $l=self::_bytes($this->stream);
69
-        switch ($whence)
70
-        {
71
-            case SEEK_SET: $newPos = $offset; break;
72
-            case SEEK_CUR: $newPos = $this->pos + $offset; break;
73
-            case SEEK_END: $newPos = $l + $offset; break;
74
-            default: return false;
75
-        }
76
-        $ret = ($newPos >=0 && $newPos <=$l);
77
-        if ($ret) $this->pos=$newPos;
78
-        return $ret;
79
-    }
66
+	public function stream_seek($offset, $whence)
67
+	{
68
+		$l=self::_bytes($this->stream);
69
+		switch ($whence)
70
+		{
71
+			case SEEK_SET: $newPos = $offset; break;
72
+			case SEEK_CUR: $newPos = $this->pos + $offset; break;
73
+			case SEEK_END: $newPos = $l + $offset; break;
74
+			default: return false;
75
+		}
76
+		$ret = ($newPos >=0 && $newPos <=$l);
77
+		if ($ret) $this->pos=$newPos;
78
+		return $ret;
79
+	}
80 80
 
81
-    public function stream_stat()
82
-    {
83
-    	if (!isset($this->stream))
84
-    	{
85
-    		return false;
86
-    	}
87
-    	return array(
81
+	public function stream_stat()
82
+	{
83
+		if (!isset($this->stream))
84
+		{
85
+			return false;
86
+		}
87
+		return array(
88 88
 			'ino'   => md5($this->name),
89 89
 			'name'  => $this->name,
90 90
 			'mode'  => 0100000,
@@ -95,7 +95,7 @@  discard block
 block discarded – undo
95 95
 			'ctime' => 0,
96 96
 			'nlink' => 1,
97 97
 		);
98
-    }
98
+	}
99 99
 
100 100
 	/**
101 101
 	 * are the string functions overloaded by their mbstring variants
Please login to merge, or discard this patch.
phpgwapi/inc/class.egw_sharing.inc.php 1 patch
Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -72,10 +72,10 @@  discard block
 block discarded – undo
72 72
 	const WRITABLE = 'share_rw';
73 73
 
74 74
  	/**
75
-	 * Modes for sharing files
76
-	 *
77
-	 * @var array
78
-	 */
75
+ 	 * Modes for sharing files
76
+ 	 *
77
+ 	 * @var array
78
+ 	 */
79 79
 	static $modes = array(
80 80
 		self::ATTACH => array(
81 81
 			'label' => 'Attachment',
@@ -112,16 +112,16 @@  discard block
 block discarded – undo
112 112
 	 */
113 113
 	public static function get_token()
114 114
 	{
115
-        // WebDAV has no concept of a query string and clients (including cadaver)
116
-        // seem to pass '?' unencoded, so we need to extract the path info out
117
-        // of the request URI ourselves
118
-        // if request URI contains a full url, remove schema and domain
115
+		// WebDAV has no concept of a query string and clients (including cadaver)
116
+		// seem to pass '?' unencoded, so we need to extract the path info out
117
+		// of the request URI ourselves
118
+		// if request URI contains a full url, remove schema and domain
119 119
 		$matches = null;
120
-        if (preg_match('|^https?://[^/]+(/.*)$|', $path_info=$_SERVER['REQUEST_URI'], $matches))
121
-        {
122
-        	$path_info = $matches[1];
123
-        }
124
-        $path_info = substr($path_info, strlen($_SERVER['SCRIPT_NAME']));
120
+		if (preg_match('|^https?://[^/]+(/.*)$|', $path_info=$_SERVER['REQUEST_URI'], $matches))
121
+		{
122
+			$path_info = $matches[1];
123
+		}
124
+		$path_info = substr($path_info, strlen($_SERVER['SCRIPT_NAME']));
125 125
 		list(, $token/*, $path*/) = preg_split('|[/?]|', $path_info, 3);
126 126
 
127 127
 		return $token;
Please login to merge, or discard this patch.
phpgwapi/inc/class.egw_include_mgr.inc.php 1 patch
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -172,7 +172,7 @@
 block discarded – undo
172 172
 	private function file_processed($file)
173 173
 	{
174 174
 		return (array_key_exists($file, $this->included_files) ||
175
-			    array_key_exists($file, $this->parsed_files));
175
+				array_key_exists($file, $this->parsed_files));
176 176
 	}
177 177
 
178 178
 	/**
Please login to merge, or discard this patch.
phpgwapi/inc/class.ldapserverinfo.inc.php 1 patch
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -32,33 +32,33 @@  discard block
 block discarded – undo
32 32
 	const SAMBA4 = 2;
33 33
 
34 34
 	/**
35
-	* @var array $namingContext holds the supported namingcontexts
36
-	*/
35
+	 * @var array $namingContext holds the supported namingcontexts
36
+	 */
37 37
 	var $namingContext = array();
38 38
 
39 39
 	/**
40
-	* @var string $version holds the LDAP server version
41
-	*/
40
+	 * @var string $version holds the LDAP server version
41
+	 */
42 42
 	var $version = 2;
43 43
 
44 44
 	/**
45
-	* @var integer $serverType holds the type of LDAP server(OpenLDAP, ADS, NDS, ...)
46
-	*/
45
+	 * @var integer $serverType holds the type of LDAP server(OpenLDAP, ADS, NDS, ...)
46
+	 */
47 47
 	var $serverType = 0;
48 48
 
49 49
 	/**
50
-	* @var string $_subSchemaEntry the subschema entry DN
51
-	*/
50
+	 * @var string $_subSchemaEntry the subschema entry DN
51
+	 */
52 52
 	var $subSchemaEntry = '';
53 53
 
54 54
 	/**
55
-	* @var array $supportedObjectClasses the supported objectclasses
56
-	*/
55
+	 * @var array $supportedObjectClasses the supported objectclasses
56
+	 */
57 57
 	var $supportedObjectClasses = array();
58 58
 
59 59
 	/**
60
-	* @var array $supportedOIDs the supported OIDs
61
-	*/
60
+	 * @var array $supportedOIDs the supported OIDs
61
+	 */
62 62
 	var $supportedOIDs = array();
63 63
 
64 64
 	/**
@@ -79,50 +79,50 @@  discard block
 block discarded – undo
79 79
 	}
80 80
 
81 81
 	/**
82
-	* gets the version
83
-	*
84
-	* @return integer the supported ldap version
85
-	*/
82
+	 * gets the version
83
+	 *
84
+	 * @return integer the supported ldap version
85
+	 */
86 86
 	function getVersion()
87 87
 	{
88 88
 		return $this->version;
89 89
 	}
90 90
 
91 91
 	/**
92
-	* sets the namingcontexts
93
-	*
94
-	* @param array $_namingContext the supported namingcontexts
95
-	*/
92
+	 * sets the namingcontexts
93
+	 *
94
+	 * @param array $_namingContext the supported namingcontexts
95
+	 */
96 96
 	function setNamingContexts($_namingContext)
97 97
 	{
98 98
 		$this->namingContext = $_namingContext;
99 99
 	}
100 100
 
101 101
 	/**
102
-	* sets the type of the ldap server(OpenLDAP, ADS, NDS, ...)
103
-	*
104
-	* @param integer $_serverType the type of ldap server
105
-	*/
102
+	 * sets the type of the ldap server(OpenLDAP, ADS, NDS, ...)
103
+	 *
104
+	 * @param integer $_serverType the type of ldap server
105
+	 */
106 106
 	function setServerType($_serverType)
107 107
 	{
108 108
 		$this->serverType = $_serverType;
109 109
 	}
110 110
 
111 111
 	/**
112
-	* sets the DN for the subschema entry
113
-	*
114
-	* @param string $_subSchemaEntry the subschema entry DN
115
-	*/
112
+	 * sets the DN for the subschema entry
113
+	 *
114
+	 * @param string $_subSchemaEntry the subschema entry DN
115
+	 */
116 116
 	function setSubSchemaEntry($_subSchemaEntry)
117 117
 	{
118 118
 		$this->subSchemaEntry = $_subSchemaEntry;
119 119
 	}
120 120
 
121 121
 	/**
122
-	* sets the supported objectclasses
123
-	*
124
-	* @param array $_supportedObjectClasses the supported objectclasses
125
-	*/
122
+	 * sets the supported objectclasses
123
+	 *
124
+	 * @param array $_supportedObjectClasses the supported objectclasses
125
+	 */
126 126
 	function setSupportedObjectClasses($_supportedObjectClasses)
127 127
 	{
128 128
 		$this->supportedOIDs = $_supportedObjectClasses;
@@ -130,20 +130,20 @@  discard block
 block discarded – undo
130 130
 	}
131 131
 
132 132
 	/**
133
-	* sets the version
134
-	*
135
-	* @param integer $_version the supported ldap version
136
-	*/
133
+	 * sets the version
134
+	 *
135
+	 * @param integer $_version the supported ldap version
136
+	 */
137 137
 	function setVersion($_version)
138 138
 	{
139 139
 		$this->version = $_version;
140 140
 	}
141 141
 
142 142
 	/**
143
-	* checks for supported objectclasses
144
-	*
145
-	* @return bool returns true if the ldap server supports this objectclass
146
-	*/
143
+	 * checks for supported objectclasses
144
+	 *
145
+	 * @return bool returns true if the ldap server supports this objectclass
146
+	 */
147 147
 	function supportsObjectClass($_objectClass)
148 148
 	{
149 149
 		if($this->supportedObjectClasses[strtolower($_objectClass)])
Please login to merge, or discard this patch.
phpgwapi/inc/adodb/drivers/adodb-mysqli.inc.php 1 patch
Indentation   +123 added lines, -123 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
 	function ADODB_mysqli()
53 53
 	{
54 54
 	 // if(!extension_loaded("mysqli"))
55
-	      ;//trigger_error("You must have the mysqli extension installed.", E_USER_ERROR);
55
+		  ;//trigger_error("You must have the mysqli extension installed.", E_USER_ERROR);
56 56
 
57 57
 	}
58 58
 
@@ -68,14 +68,14 @@  discard block
 block discarded – undo
68 68
 	  	 if(!extension_loaded("mysqli")) {
69 69
 			return null;
70 70
 		 }
71
-	    $this->_connectionID = @mysqli_init();
71
+		$this->_connectionID = @mysqli_init();
72 72
 
73
-	    if (is_null($this->_connectionID)) {
74
-	      // mysqli_init only fails if insufficient memory
75
-	      if ($this->debug)
73
+		if (is_null($this->_connectionID)) {
74
+		  // mysqli_init only fails if insufficient memory
75
+		  if ($this->debug)
76 76
 				ADOConnection::outp("mysqli_init() failed : "  . $this->ErrorMsg());
77
-	      return false;
78
-	    }
77
+		  return false;
78
+		}
79 79
 		/*
80 80
 		I suggest a simple fix which would enable adodb and mysqli driver to
81 81
 		read connection options from the standard mysql configuration file
@@ -91,10 +91,10 @@  discard block
 block discarded – undo
91 91
 		if ($persist && PHP_VERSION > 5.2 && strncmp($argHostname,'p:',2) != 0) $argHostname = 'p:'.$argHostname;
92 92
 
93 93
 		$ok = @mysqli_real_connect($this->_connectionID,
94
- 				    $argHostname,
95
- 				    $argUsername,
96
- 				    $argPassword,
97
- 				    $argDatabasename,
94
+ 					$argHostname,
95
+ 					$argUsername,
96
+ 					$argPassword,
97
+ 					$argDatabasename,
98 98
 					$this->port,
99 99
 					$this->socket,
100 100
 					$this->clientFlags);
@@ -121,8 +121,8 @@  discard block
 block discarded – undo
121 121
 	// In _connect(), check $this->forceNewConnect?
122 122
 	function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
123 123
 	  {
124
-	    $this->forceNewConnect = true;
125
-	    return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
124
+		$this->forceNewConnect = true;
125
+		return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
126 126
 	  }
127 127
 
128 128
 	/**
@@ -135,7 +135,7 @@  discard block
 block discarded – undo
135 135
 	 */
136 136
 	function IsConnected()
137 137
 	{
138
-    	return $this->_connectionID && @mysqli_ping($this->_connectionID);
138
+		return $this->_connectionID && @mysqli_ping($this->_connectionID);
139 139
 	}
140 140
 
141 141
 	function IfNull( $field, $ifNull )
@@ -193,12 +193,12 @@  discard block
 block discarded – undo
193 193
 	function qstr($s, $magic_quotes = false)
194 194
 	{
195 195
 		if (!$magic_quotes) {
196
-	    	if (PHP_VERSION >= 5 && $this->_connectionID)
197
-	      		return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";
196
+			if (PHP_VERSION >= 5 && $this->_connectionID)
197
+		  		return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";
198 198
 
199 199
 		if ($this->replaceQuote[0] == '\\')
200 200
 			$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
201
-	    return  "'".str_replace("'",$this->replaceQuote,$s)."'";
201
+		return  "'".str_replace("'",$this->replaceQuote,$s)."'";
202 202
 	  }
203 203
 	  // undo magic quotes for "
204 204
 	  $s = str_replace('\\"','"',$s);
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
 	{
210 210
 	  $result = @mysqli_insert_id($this->_connectionID);
211 211
 	  if ($result == -1){
212
-	      if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : "  . $this->ErrorMsg());
212
+		  if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : "  . $this->ErrorMsg());
213 213
 	  }
214 214
 	  return $result;
215 215
 	}
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 	{
220 220
 	  $result =  @mysqli_affected_rows($this->_connectionID);
221 221
 	  if ($result == -1) {
222
-	      if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : "  . $this->ErrorMsg());
222
+		  if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : "  . $this->ErrorMsg());
223 223
 	  }
224 224
 	  return $result;
225 225
 	}
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 			}
277 277
    		   return $arr;
278 278
 		}
279
-        return $ret;
279
+		return $ret;
280 280
 	}
281 281
 
282 282
 
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 		$save = $ADODB_FETCH_MODE;
290 290
 		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
291 291
 		if ($this->fetchMode !== FALSE) {
292
-		       $savem = $this->SetFetchMode(FALSE);
292
+			   $savem = $this->SetFetchMode(FALSE);
293 293
 		}
294 294
 
295 295
 		// get index details
@@ -297,37 +297,37 @@  discard block
 block discarded – undo
297 297
 
298 298
 		// restore fetchmode
299 299
 		if (isset($savem)) {
300
-		        $this->SetFetchMode($savem);
300
+				$this->SetFetchMode($savem);
301 301
 		}
302 302
 		$ADODB_FETCH_MODE = $save;
303 303
 
304 304
 		if (!is_object($rs)) {
305
-		        return $false;
305
+				return $false;
306 306
 		}
307 307
 
308 308
 		$indexes = array ();
309 309
 
310 310
 		// parse index data into array
311 311
 		while ($row = $rs->FetchRow()) {
312
-		        if ($primary == FALSE AND $row[2] == 'PRIMARY') {
313
-		                continue;
314
-		        }
315
-
316
-		        if (!isset($indexes[$row[2]])) {
317
-		                $indexes[$row[2]] = array(
318
-		                        'unique' => ($row[1] == 0),
319
-		                        'columns' => array()
320
-		                );
321
-		        }
322
-
323
-		        $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4].
324
-                	(is_numeric($row[7]) ? '('.(int)$row[7].')' : '');
312
+				if ($primary == FALSE AND $row[2] == 'PRIMARY') {
313
+						continue;
314
+				}
315
+
316
+				if (!isset($indexes[$row[2]])) {
317
+						$indexes[$row[2]] = array(
318
+								'unique' => ($row[1] == 0),
319
+								'columns' => array()
320
+						);
321
+				}
322
+
323
+				$indexes[$row[2]]['columns'][$row[3] - 1] = $row[4].
324
+					(is_numeric($row[7]) ? '('.(int)$row[7].')' : '');
325 325
 		}
326 326
 
327 327
 		// sort columns by order in the index
328 328
 		foreach ( array_keys ($indexes) as $index )
329 329
 		{
330
-		        ksort ($indexes[$index]['columns']);
330
+				ksort ($indexes[$index]['columns']);
331 331
 		}
332 332
 
333 333
 		return $indexes;
@@ -452,39 +452,39 @@  discard block
 block discarded – undo
452 452
 
453 453
 	// "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
454 454
 	function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
455
-     {
456
-         if ( !empty($owner) ) {
457
-            $table = "$owner.$table";
458
-         }
459
-         $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
460
-         $create_sql     = $a_create_table[1];
461
-
462
-         $matches        = array();
463
-         $foreign_keys   = array();
464
-         if ( preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches) ) {
465
-             $num_keys = count($matches[0]);
466
-             for ( $i = 0;  $i < $num_keys;  $i ++ ) {
467
-                 $my_field  = explode('`, `', $matches[1][$i]);
468
-                 $ref_table = $matches[2][$i];
469
-                 $ref_field = explode('`, `', $matches[3][$i]);
470
-
471
-                 if ( $upper ) {
472
-                     $ref_table = strtoupper($ref_table);
473
-                 }
474
-
475
-                 $foreign_keys[$ref_table] = array();
476
-                 $num_fields               = count($my_field);
477
-                 for ( $j = 0;  $j < $num_fields;  $j ++ ) {
478
-                     if ( $asociative ) {
479
-                         $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
480
-                     } else {
481
-                         $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
482
-                     }
483
-                 }
484
-             }
485
-         }
486
-         return  $foreign_keys;
487
-     }
455
+	 {
456
+		 if ( !empty($owner) ) {
457
+			$table = "$owner.$table";
458
+		 }
459
+		 $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
460
+		 $create_sql     = $a_create_table[1];
461
+
462
+		 $matches        = array();
463
+		 $foreign_keys   = array();
464
+		 if ( preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches) ) {
465
+			 $num_keys = count($matches[0]);
466
+			 for ( $i = 0;  $i < $num_keys;  $i ++ ) {
467
+				 $my_field  = explode('`, `', $matches[1][$i]);
468
+				 $ref_table = $matches[2][$i];
469
+				 $ref_field = explode('`, `', $matches[3][$i]);
470
+
471
+				 if ( $upper ) {
472
+					 $ref_table = strtoupper($ref_table);
473
+				 }
474
+
475
+				 $foreign_keys[$ref_table] = array();
476
+				 $num_fields               = count($my_field);
477
+				 for ( $j = 0;  $j < $num_fields;  $j ++ ) {
478
+					 if ( $asociative ) {
479
+						 $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
480
+					 } else {
481
+						 $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
482
+					 }
483
+				 }
484
+			 }
485
+		 }
486
+		 return  $foreign_keys;
487
+	 }
488 488
 
489 489
  	function &MetaColumns($table)
490 490
 	{
@@ -558,24 +558,24 @@  discard block
 block discarded – undo
558 558
 	function SelectDB($dbName)
559 559
 	{
560 560
 //	    $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID);
561
-	    $this->databaseName = $dbName;
562
-	    if ($this->_connectionID) {
563
-        	$result = @mysqli_select_db($this->_connectionID, $dbName);
561
+		$this->databaseName = $dbName;
562
+		if ($this->_connectionID) {
563
+			$result = @mysqli_select_db($this->_connectionID, $dbName);
564 564
 			if (!$result && $this->debug) {
565
-		    	ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
565
+				ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
566 566
 			}
567 567
 			return $result;
568 568
 		}
569
-	    return false;
569
+		return false;
570 570
 	}
571 571
 
572 572
 	// parameters use PostgreSQL convention, not MySQL
573 573
 	function &SelectLimit($sql,
574
-			      $nrows = -1,
575
-			      $offset = -1,
576
-			      $inputarr = false,
577
-			      $arg3 = false,
578
-			      $secs = 0)
574
+				  $nrows = -1,
575
+				  $offset = -1,
576
+				  $inputarr = false,
577
+				  $arg3 = false,
578
+				  $secs = 0)
579 579
 	{
580 580
 		$offsetStr = ($offset >= 0) ? "$offset," : '';
581 581
 		if ($nrows < 0) $nrows = '18446744073709551615';
@@ -623,8 +623,8 @@  discard block
 block discarded – undo
623 623
 			return $ret;
624 624
 		}
625 625
 		if (!$mysql_res =  mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {
626
-		    if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
627
-		    return false;
626
+			if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
627
+			return false;
628 628
 		}
629 629
 
630 630
 		return $mysql_res;
@@ -633,27 +633,27 @@  discard block
 block discarded – undo
633 633
 	/*	Returns: the last error message from previous database operation	*/
634 634
 	function ErrorMsg()
635 635
 	  {
636
-	    if (empty($this->_connectionID))
637
-	      $this->_errorMsg = @mysqli_connect_error();
638
-	    else
639
-	      $this->_errorMsg = @mysqli_error($this->_connectionID);
640
-	    return $this->_errorMsg;
636
+		if (empty($this->_connectionID))
637
+		  $this->_errorMsg = @mysqli_connect_error();
638
+		else
639
+		  $this->_errorMsg = @mysqli_error($this->_connectionID);
640
+		return $this->_errorMsg;
641 641
 	  }
642 642
 
643 643
 	/*	Returns: the last error number from previous database operation	*/
644 644
 	function ErrorNo()
645 645
 	  {
646
-	    if (empty($this->_connectionID))
647
-	      return @mysqli_connect_errno();
648
-	    else
649
-	      return @mysqli_errno($this->_connectionID);
646
+		if (empty($this->_connectionID))
647
+		  return @mysqli_connect_errno();
648
+		else
649
+		  return @mysqli_errno($this->_connectionID);
650 650
 	  }
651 651
 
652 652
 	// returns true or false
653 653
 	function _close()
654 654
 	  {
655
-	    @mysqli_close($this->_connectionID);
656
-	    $this->_connectionID = false;
655
+		@mysqli_close($this->_connectionID);
656
+		$this->_connectionID = false;
657 657
 	  }
658 658
 
659 659
 	/*
@@ -673,8 +673,8 @@  discard block
 block discarded – undo
673 673
 	}
674 674
 
675 675
 	/**
676
-     * @var array $charset2mysql translate www charsets to mysql ones
677
-     */
676
+	 * @var array $charset2mysql translate www charsets to mysql ones
677
+	 */
678 678
 	var $charset2mysql = array(
679 679
 		'utf-8'        => 'utf8',
680 680
 		'iso-8859-1'   => 'latin1',
@@ -742,24 +742,24 @@  discard block
 block discarded – undo
742 742
 	{
743 743
 	  if ($mode === false)
744 744
 	   {
745
-	      global $ADODB_FETCH_MODE;
746
-	      $mode = $ADODB_FETCH_MODE;
745
+		  global $ADODB_FETCH_MODE;
746
+		  $mode = $ADODB_FETCH_MODE;
747 747
 	   }
748 748
 
749 749
 	  switch ($mode)
750
-	    {
751
-	    case ADODB_FETCH_NUM:
752
-	      $this->fetchMode = MYSQLI_NUM;
753
-	      break;
754
-	    case ADODB_FETCH_ASSOC:
755
-	      $this->fetchMode = MYSQLI_ASSOC;
756
-	      break;
757
-	    case ADODB_FETCH_DEFAULT:
758
-	    case ADODB_FETCH_BOTH:
759
-	    default:
760
-	      $this->fetchMode = MYSQLI_BOTH;
761
-	      break;
762
-	    }
750
+		{
751
+		case ADODB_FETCH_NUM:
752
+		  $this->fetchMode = MYSQLI_NUM;
753
+		  break;
754
+		case ADODB_FETCH_ASSOC:
755
+		  $this->fetchMode = MYSQLI_ASSOC;
756
+		  break;
757
+		case ADODB_FETCH_DEFAULT:
758
+		case ADODB_FETCH_BOTH:
759
+		default:
760
+		  $this->fetchMode = MYSQLI_BOTH;
761
+		  break;
762
+		}
763 763
 	  $this->adodbFetchMode = $mode;
764 764
 	  $this->ADORecordSet($queryID);
765 765
 	}
@@ -776,7 +776,7 @@  discard block
 block discarded – undo
776 776
 	{
777 777
 	  $fieldnr = $fieldOffset;
778 778
 	  if ($fieldOffset != -1) {
779
-	    $fieldOffset = mysqli_field_seek($this->_queryID, $fieldnr);
779
+		$fieldOffset = mysqli_field_seek($this->_queryID, $fieldnr);
780 780
 	  }
781 781
 	  $o = mysqli_fetch_field($this->_queryID);
782 782
 	  return $o;
@@ -785,7 +785,7 @@  discard block
 block discarded – undo
785 785
 	function &GetRowAssoc($upper = true)
786 786
 	{
787 787
 	  if ($this->fetchMode == MYSQLI_ASSOC && !$upper)
788
-	    return $this->fields;
788
+		return $this->fields;
789 789
 	  $row =& ADORecordSet::GetRowAssoc($upper);
790 790
 	  return $row;
791 791
 	}
@@ -794,14 +794,14 @@  discard block
 block discarded – undo
794 794
 	function Fields($colname)
795 795
 	{
796 796
 	  if ($this->fetchMode != MYSQLI_NUM)
797
-	    return @$this->fields[$colname];
797
+		return @$this->fields[$colname];
798 798
 
799 799
 	  if (!$this->bind) {
800
-	    $this->bind = array();
801
-	    for ($i = 0; $i < $this->_numOfFields; $i++) {
802
-	      $o = $this->FetchField($i);
803
-	      $this->bind[strtoupper($o->name)] = $i;
804
-	    }
800
+		$this->bind = array();
801
+		for ($i = 0; $i < $this->_numOfFields; $i++) {
802
+		  $o = $this->FetchField($i);
803
+		  $this->bind[strtoupper($o->name)] = $i;
804
+		}
805 805
 	  }
806 806
 	  return $this->fields[$this->bind[strtoupper($colname)]];
807 807
 	}
@@ -809,10 +809,10 @@  discard block
 block discarded – undo
809 809
 	function _seek($row)
810 810
 	{
811 811
 	  if ($this->_numOfRows == 0)
812
-	    return false;
812
+		return false;
813 813
 
814 814
 	  if ($row < 0)
815
-	    return false;
815
+		return false;
816 816
 
817 817
 	  mysqli_data_seek($this->_queryID, $row);
818 818
 	  $this->EOF = false;
@@ -877,9 +877,9 @@  discard block
 block discarded – undo
877 877
 	function MetaType($t, $len = -1, $fieldobj = false)
878 878
 	{
879 879
 		if (is_object($t)) {
880
-		    $fieldobj = $t;
881
-		    $t = $fieldobj->type;
882
-		    $len = $fieldobj->max_length;
880
+			$fieldobj = $t;
881
+			$t = $fieldobj->type;
882
+			$len = $fieldobj->max_length;
883 883
 		}
884 884
 
885 885
 
Please login to merge, or discard this patch.
phpgwapi/inc/adodb/drivers/adodb-postgres64.inc.php 1 patch
Indentation   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
 	var $_resultid = false;
62 62
   	var $concat_operator='||';
63 63
 	var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
64
-    var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
64
+	var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
65 65
 	and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
66 66
 	 'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
67 67
 	union
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
 	{
227 227
 		$info = $this->ServerInfo();
228 228
 		if ($info['version'] >= 7.3) {
229
-	    	$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
229
+			$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
230 230
 			  and schemaname  not in ( 'pg_catalog','information_schema')
231 231
 	union
232 232
         select viewname,'V' from pg_views where viewname not like 'pg\_%'  and schemaname  not in ( 'pg_catalog','information_schema') ";
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
 	{
444 444
 
445 445
 		if ($blobtype == 'CLOB') {
446
-    		return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where");
446
+			return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where");
447 447
 		}
448 448
 		// do not use bind params which uses qstr(), as blobencode() already quotes data
449 449
 		return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where");
@@ -573,8 +573,8 @@  discard block
 block discarded – undo
573 573
 	}
574 574
 
575 575
 	  function &MetaIndexes ($table, $primary = FALSE)
576
-      {
577
-         global $ADODB_FETCH_MODE;
576
+	  {
577
+		 global $ADODB_FETCH_MODE;
578 578
 
579 579
 				// table-name must NOT be quoted, otherwise we will not find any index
580 580
 				$table = str_replace($this->nameQuote, '', $table);
@@ -591,50 +591,50 @@  discard block
 block discarded – undo
591 591
 	,pg_namespace n
592 592
 WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\' AND i.indisprimary=false';
593 593
 				} else {
594
-	                $sql = '
594
+					$sql = '
595 595
 SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns"
596 596
 FROM pg_catalog.pg_class c
597 597
 JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid
598 598
 JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid
599 599
 WHERE c2.relname=\'%s\' or c2.relname=lower(\'%s\')';
600
-    			}
601
-
602
-                if ($primary == FALSE) {
603
-                	$sql .= ' AND i.indisprimary=false;';
604
-                }
605
-
606
-                $save = $ADODB_FETCH_MODE;
607
-                $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
608
-                if ($this->fetchMode !== FALSE) {
609
-                        $savem = $this->SetFetchMode(FALSE);
610
-                }
611
-
612
-                $rs = $this->Execute(sprintf($sql,$table,$table,$schema));
613
-                if (isset($savem)) {
614
-                        $this->SetFetchMode($savem);
615
-                }
616
-                $ADODB_FETCH_MODE = $save;
617
-
618
-                if (!is_object($rs)) {
619
-                	$false = false;
600
+				}
601
+
602
+				if ($primary == FALSE) {
603
+					$sql .= ' AND i.indisprimary=false;';
604
+				}
605
+
606
+				$save = $ADODB_FETCH_MODE;
607
+				$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
608
+				if ($this->fetchMode !== FALSE) {
609
+						$savem = $this->SetFetchMode(FALSE);
610
+				}
611
+
612
+				$rs = $this->Execute(sprintf($sql,$table,$table,$schema));
613
+				if (isset($savem)) {
614
+						$this->SetFetchMode($savem);
615
+				}
616
+				$ADODB_FETCH_MODE = $save;
617
+
618
+				if (!is_object($rs)) {
619
+					$false = false;
620 620
 					return $false;
621
-                }
622
-
623
-                $col_names = $this->MetaColumnNames($table,true);
624
-                $indexes = array();
625
-                while ($row = $rs->FetchRow()) {
626
-                        $columns = array();
627
-                        foreach (explode(' ', $row[2]) as $col) {
628
-                                $columns[] = $col_names[$col - 1];
629
-                        }
630
-
631
-                        $indexes[$row[0]] = array(
632
-                                'unique' => ($row[1] == 't'),
633
-                                'columns' => $columns
634
-                        );
635
-                }
636
-                return $indexes;
637
-        }
621
+				}
622
+
623
+				$col_names = $this->MetaColumnNames($table,true);
624
+				$indexes = array();
625
+				while ($row = $rs->FetchRow()) {
626
+						$columns = array();
627
+						foreach (explode(' ', $row[2]) as $col) {
628
+								$columns[] = $col_names[$col - 1];
629
+						}
630
+
631
+						$indexes[$row[0]] = array(
632
+								'unique' => ($row[1] == 't'),
633
+								'columns' => $columns
634
+						);
635
+				}
636
+				return $indexes;
637
+		}
638 638
 
639 639
 	// returns true or false
640 640
 	//
@@ -967,7 +967,7 @@  discard block
 block discarded – undo
967 967
 	{
968 968
 
969 969
 		if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
970
-        	return false;
970
+			return false;
971 971
 
972 972
 		$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
973 973
 
Please login to merge, or discard this patch.