jpmobile 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. data/VERSION.yml +1 -1
  2. data/lib/jpmobile/rack/params_filter.rb +1 -1
  3. data/test/rails/rails_root/app/models/mobile_mailer.rb +18 -0
  4. data/test/rails/rails_root/config/initializers/secret_token.rb +1 -1
  5. data/test/rails/rails_root/spec/models/mobile_mailer_spec.rb +744 -0
  6. data/test/rails/rails_root/spec/spec_helper.rb +6 -0
  7. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile.rb +2 -0
  8. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/email.rb +17 -2
  9. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon.rb +85 -23
  10. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/au.rb +644 -0
  11. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/softbank.rb +488 -0
  12. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/emoticon/z_combine.rb +16 -13
  13. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/hook_action_mailer.rb +22 -0
  14. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mail.rb +265 -0
  15. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/abstract_mobile.rb +35 -0
  16. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/au.rb +28 -2
  17. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/docomo.rb +24 -1
  18. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/emobile.rb +1 -1
  19. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/softbank.rb +34 -1
  20. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/vodafone.rb +1 -1
  21. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/mobile/willcom.rb +1 -1
  22. data/test/rails/rails_root/vendor/plugins/jpmobile/lib/jpmobile/util.rb +214 -13
  23. metadata +11 -3
@@ -27,6 +27,12 @@ RSpec.configure do |config|
27
27
  config.include Webrat::HaveTagMatcher
28
28
  config.include Jpmobile::Util
29
29
  config.before(:each) { Webrat.configuration.mode = :rails }
30
+
31
+ config.filter_run :focus => true
32
+ config.run_all_when_everything_filtered = true
33
+ config.color_enabled = true
34
+ config.filter_run_excluding :broken => true
35
+ config.full_backtrace = true
30
36
  end
31
37
 
32
38
  require 'pp'
@@ -49,6 +49,8 @@ module Jpmobile
49
49
  autoload :Config, 'jpmobile/rack/config'
50
50
  end
51
51
  autoload :Configuration, 'jpmobile/rack'
52
+
53
+ autoload :Mailer, 'jpmobile/hook_action_mailer'
52
54
  end
53
55
 
54
56
  if defined?(Rails)
@@ -4,13 +4,28 @@
4
4
  module Jpmobile
5
5
  # email関連の処理
6
6
  module Email
7
+ module_function
8
+
7
9
  # メールアドレスよりキャリア情報を取得する
8
10
  # _param1_:: email メールアドレス
9
11
  # return :: Jpmobile::Mobileで定義されている携帯キャリアクラス
10
- def self.detect(email)
12
+ def detect(email)
11
13
  Mobile.carriers.each do |const|
12
14
  c = Mobile.const_get(const)
13
- return c if c::MAIL_ADDRESS_REGEXP && email =~ c::MAIL_ADDRESS_REGEXP
15
+ return c if c::MAIL_ADDRESS_REGEXP && email.match(/^#{c::MAIL_ADDRESS_REGEXP}$/)
16
+ end
17
+ nil
18
+ end
19
+
20
+ # 含まれているメールアドレスからキャリア情報を取得する
21
+ def detect_from_mail_header(str)
22
+ Mobile.carriers.each do |const|
23
+ c = Mobile.const_get(const)
24
+ if c::MAIL_ADDRESS_REGEXP &&
25
+ str.match(/(\S+@[A-Za-z0-9\-\.\_]+)/) &&
26
+ $1.match(/^#{c::MAIL_ADDRESS_REGEXP}$/)
27
+ return c
28
+ end
14
29
  end
15
30
  nil
16
31
  end
@@ -9,8 +9,13 @@ module Jpmobile
9
9
  %w( DOCOMO_SJIS_TO_UNICODE DOCOMO_UNICODE_TO_SJIS ).each do |const|
10
10
  autoload const, 'jpmobile/emoticon/docomo'
11
11
  end
12
- autoload :AU_SJIS_TO_UNICODE, 'jpmobile/emoticon/au'
13
- %w( SOFTBANK_UNICODE_TO_WEBCODE SOFTBANK_WEBCODE_TO_UNICODE ).each do |const|
12
+ %w( AU_SJIS_TO_UNICODE AU_UNICODE_TO_EMAILJIS AU_SJIS_TO_EMAIL_JIS ).each do |const|
13
+ autoload const, 'jpmobile/emoticon/au'
14
+ end
15
+ %w(
16
+ SOFTBANK_UNICODE_TO_WEBCODE SOFTBANK_WEBCODE_TO_UNICODE
17
+ SOFTBANK_UNICODE_TO_SJIS SOFTBANK_SJIS_TO_UNICODE
18
+ ).each do |const|
14
19
  autoload const, 'jpmobile/emoticon/softbank'
15
20
  end
16
21
  %w( CONVERSION_TABLE_TO_DOCOMO CONVERSION_TABLE_TO_AU CONVERSION_TABLE_TO_SOFTBANK ).each do |const|
@@ -20,6 +25,7 @@ module Jpmobile
20
25
  SJIS_TO_UNICODE UNICODE_TO_SJIS
21
26
  SJIS_REGEXP SOFTBANK_WEBCODE_REGEXP DOCOMO_SJIS_REGEXP AU_SJIS_REGEXP SOFTBANK_UNICODE_REGEXP
22
27
  EMOTICON_UNICODES UTF8_REGEXP
28
+ CONVERSION_TABLE_TO_PC_EMAIL SOFTBANK_SJIS_REGEXP AU_EMAILJIS_REGEXP
23
29
  ).each do |const|
24
30
  autoload const, 'jpmobile/emoticon/z_combine'
25
31
  end
@@ -33,7 +39,7 @@ module Jpmobile
33
39
  end
34
40
  end
35
41
 
36
- # +str+ のなかでDoCoMo絵文字をUnicode数値文字参照に置換した文字列を返す。
42
+ # +str+ のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。
37
43
  def self.external_to_unicodecr_au(str)
38
44
  str.gsub(AU_SJIS_REGEXP) do |match|
39
45
  sjis = match.unpack('n').first
@@ -42,6 +48,16 @@ module Jpmobile
42
48
  end
43
49
  end
44
50
 
51
+ # +str+ のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。(メール専用)
52
+ def self.external_to_unicodecr_au_mail(in_str)
53
+ str = Jpmobile::Util.ascii_8bit(in_str)
54
+ str.gsub(AU_EMAILJIS_REGEXP) do |match|
55
+ jis = match.unpack('n').first
56
+ unicode = AU_EMAILJIS_TO_UNICODE[jis]
57
+ unicode ? Jpmobile::Util.ascii_8bit("\x1b\x28\x42&#x%04x;\x1b\x24\x42"%unicode) : match
58
+ end
59
+ end
60
+
45
61
  # +str+のなかでUTF8のSoftBank絵文字を(+0x1000だけシフトして)Unicode数値文字参照に変換した文字列を返す。
46
62
  def self.external_to_unicodecr_softbank(str)
47
63
  # SoftBank Unicode
@@ -50,24 +66,17 @@ module Jpmobile
50
66
  "&#x%04x;" % (unicode+0x1000)
51
67
  end
52
68
  end
69
+ def self.external_to_unicodecr_softbank_sjis(str)
70
+ # SoftBank Shift_JIS
71
+ str.gsub(SOFTBANK_SJIS_REGEXP) do |match|
72
+ sjis = match.unpack('n').first
73
+ unicode = SOFTBANK_SJIS_TO_UNICODE[sjis]
74
+ "&#x%04x;" % (unicode+0x1000)
75
+ end
76
+ end
53
77
  def self.external_to_unicodecr_vodafone(str)
54
78
  external_to_unicodecr_softbank(str)
55
79
  end
56
- # +str+のなかでWebcodeのSoftBank絵文字を(+0x1000だけシフトして)Unicode数値文字参照に変換した文字列を返す。
57
- def self.external_to_unicodecr_jphone(str)
58
- # SoftBank Webcode
59
- s = str.clone
60
- # 連続したエスケープコードが省略されている場合は切りはなす。
61
- s.gsub!(/\x1b\x24(.)(.+?)\x0f/) do |match|
62
- a = $1
63
- $2.split(//).map{|x| "\x1b\x24#{a}#{x}\x0f"}.join('')
64
- end
65
- # Webcodeを変換
66
- s.gsub(SOFTBANK_WEBCODE_REGEXP) do |match|
67
- unicode = SOFTBANK_WEBCODE_TO_UNICODE[match[2,2]] + 0x1000
68
- unicode ? ("&#x%04x;"%unicode) : match
69
- end
70
- end
71
80
 
72
81
  # +str+ のなかでUnicode数値文字参照で表記された絵文字を携帯側エンコーディングに置換する。
73
82
  #
@@ -91,16 +100,15 @@ module Jpmobile
91
100
  # 変換先がUnicodeで指定されている。つまり対応する絵文字がある。
92
101
  if sjis = UNICODE_TO_SJIS[converted]
93
102
  if to_sjis
94
- sjis_emotion = [sjis].pack('n')
95
- if sjis_emotion.respond_to?(:force_encoding)
96
- sjis_emotion.force_encoding("Shift_JIS")
97
- end
98
- sjis_emotion
103
+ sjis_emotion = Jpmobile::Util.sjis([sjis].pack('n'))
99
104
  else
100
105
  [converted].pack("U")
101
106
  end
102
107
  elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
103
108
  [converted-0x1000].pack('U')
109
+ elsif converted == GETA
110
+ # PCで〓を表示する場合
111
+ [GETA].pack("U")
104
112
  else
105
113
  # キャリア変換テーブルに指定されていたUnicodeに対応する
106
114
  # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
@@ -137,5 +145,59 @@ module Jpmobile
137
145
  "&#x%04x;" % match.unpack('U').first
138
146
  end
139
147
  end
148
+
149
+ # +str+ のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する
150
+ # au 専用
151
+ def self.unicodecr_to_au_email(in_str)
152
+ str = Jpmobile::Util.ascii_8bit(in_str)
153
+ regexp = Regexp.compile(Jpmobile::Util.ascii_8bit("&#x([0-9a-f]{4});"), Regexp::IGNORECASE)
154
+ str.gsub(regexp) do |match|
155
+ unicode = $1.scanf("%x").first
156
+ converted = CONVERSION_TABLE_TO_AU[unicode]
157
+
158
+ # メール用エンコーディングに変換する
159
+ case converted
160
+ when Integer
161
+ if sjis = UNICODE_TO_SJIS[converted]
162
+ if email_jis = SJIS_TO_EMAIL_JIS[sjis]
163
+ Jpmobile::Util.ascii_8bit("\x1b\x24\x42#{[email_jis].pack('n')}\x1b\x28\x42")
164
+ else
165
+ Jpmobile::Util.ascii_8bit([sjis].pack('n'))
166
+ end
167
+ else
168
+ match
169
+ end
170
+ when String
171
+ # FIXME: 絵文字の代替が文章でいいかどうかの検証
172
+ Jpmobile::Util.ascii_8bit(Jpmobile::Util.utf8_to_jis(converted))
173
+ else
174
+ match
175
+ end
176
+ end
177
+ end
178
+
179
+ # +str+ のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する
180
+ # softbank 専用
181
+ def self.unicodecr_to_softbank_email(str)
182
+ str.gsub(/&#x([0-9a-f]{4});/i) do |match|
183
+ unicode = $1.scanf("%x").first
184
+ converted = CONVERSION_TABLE_TO_SOFTBANK[unicode]
185
+
186
+ # メール用エンコーディングに変換する
187
+ case converted
188
+ when Integer
189
+ if sjis = SOFTBANK_UNICODE_TO_SJIS[converted-0x1000]
190
+ Jpmobile::Util.sjis([sjis].pack('n'))
191
+ else
192
+ match
193
+ end
194
+ when String
195
+ # FIXME: 絵文字の代替が文章でいいかどうかの検証
196
+ Jpmobile::Util.utf8_to_sjis(converted)
197
+ else
198
+ match
199
+ end
200
+ end
201
+ end
140
202
  end
141
203
  end
@@ -1285,3 +1285,647 @@ Jpmobile::Emoticon::AU_EMAILJIS_TO_UNICODE = {
1285
1285
  0x7B6C=>0xEB87,
1286
1286
  0x7B6D=>0xEB88,
1287
1287
  }.freeze
1288
+ Jpmobile::Emoticon::AU_UNICODE_TO_EMAILJIS = Jpmobile::Emoticon::AU_EMAILJIS_TO_UNICODE.invert.freeze
1289
+ Jpmobile::Emoticon::AU_SJIS_TO_EMAIL_JIS = {
1290
+ 0xF659 => 0x753A,
1291
+ 0xF75E => 0x773F,
1292
+ 0xF65A => 0x753B,
1293
+ 0xF75F => 0x7740,
1294
+ 0xF65B => 0x753C,
1295
+ 0xF760 => 0x7741,
1296
+ 0xF748 => 0x7729,
1297
+ 0xF761 => 0x7742,
1298
+ 0xF749 => 0x772A,
1299
+ 0xF762 => 0x7743,
1300
+ 0xF74A => 0x772B,
1301
+ 0xF763 => 0x7744,
1302
+ 0xF74B => 0x772C,
1303
+ 0xF764 => 0x7745,
1304
+ 0xF74C => 0x772D,
1305
+ 0xF765 => 0x7746,
1306
+ 0xF74D => 0x772E,
1307
+ 0xF766 => 0x7747,
1308
+ 0xF74E => 0x772F,
1309
+ 0xF767 => 0x7748,
1310
+ 0xF74F => 0x7730,
1311
+ 0xF768 => 0x7749,
1312
+ 0xF69A => 0x757A,
1313
+ 0xF769 => 0x774A,
1314
+ 0xF6EA => 0x766C,
1315
+ 0xF660 => 0x7541,
1316
+ 0xF796 => 0x7776,
1317
+ 0xF693 => 0x7573,
1318
+ 0xF65E => 0x753F,
1319
+ 0xF7B1 => 0x7833,
1320
+ 0xF65F => 0x7540,
1321
+ 0xF661 => 0x7542,
1322
+ 0xF750 => 0x7731,
1323
+ 0xF6EB => 0x766D,
1324
+ 0xF751 => 0x7732,
1325
+ 0xF77C => 0x775D,
1326
+ 0xF752 => 0x7733,
1327
+ 0xF6D3 => 0x7655,
1328
+ 0xF753 => 0x7734,
1329
+ 0xF7B2 => 0x7834,
1330
+ 0xF754 => 0x7735,
1331
+ 0xF69B => 0x757B,
1332
+ 0xF755 => 0x7736,
1333
+ 0xF6EC => 0x766E,
1334
+ 0xF756 => 0x7737,
1335
+ 0xF76A => 0x774B,
1336
+ 0xF757 => 0x7738,
1337
+ 0xF76B => 0x774C,
1338
+ 0xF797 => 0x7777,
1339
+ 0xF77D => 0x775E,
1340
+ 0xF758 => 0x7739,
1341
+ 0xF798 => 0x7778,
1342
+ 0xF759 => 0x773A,
1343
+ 0xF654 => 0x7535,
1344
+ 0xF75A => 0x773B,
1345
+ 0xF77E => 0x775F,
1346
+ 0xF75B => 0x773C,
1347
+ 0xF662 => 0x7543,
1348
+ 0xF75C => 0x773D,
1349
+ 0xF76C => 0x774D,
1350
+ 0xF75D => 0x773E,
1351
+ 0xF76D => 0x774E,
1352
+ 0xF76E => 0x774F,
1353
+ 0xF6EE => 0x7670,
1354
+ 0xF76F => 0x7750,
1355
+ 0xF664 => 0x7545,
1356
+ 0xF69C => 0x757C,
1357
+ 0xF694 => 0x7574,
1358
+ 0xF770 => 0x7751,
1359
+ 0xF782 => 0x7762,
1360
+ 0xF780 => 0x7760,
1361
+ 0xF65C => 0x753D,
1362
+ 0xF6D4 => 0x7656,
1363
+ 0xF642 => 0x7523,
1364
+ 0xF663 => 0x7544,
1365
+ 0xF783 => 0x7763,
1366
+ 0xF771 => 0x7752,
1367
+ 0xF784 => 0x7764,
1368
+ 0xF772 => 0x7753,
1369
+ 0xF785 => 0x7765,
1370
+ 0xF6ED => 0x766F,
1371
+ 0xF786 => 0x7766,
1372
+ 0xF773 => 0x7754,
1373
+ 0xF6EF => 0x7671,
1374
+ 0xF6B8 => 0x763A,
1375
+ 0xF787 => 0x7767,
1376
+ 0xF640 => 0x7521,
1377
+ 0xF676 => 0x7557,
1378
+ 0xF644 => 0x7525,
1379
+ 0xF665 => 0x7546,
1380
+ 0xF64E => 0x752F,
1381
+ 0xF6FA => 0x767C,
1382
+ 0xF6B9 => 0x763B,
1383
+ 0xF79A => 0x777A,
1384
+ 0xF7AC => 0x782E,
1385
+ 0xF6F0 => 0x7672,
1386
+ 0xF6D5 => 0x7657,
1387
+ 0xF79B => 0x777B,
1388
+ 0xF774 => 0x7755,
1389
+ 0xF684 => 0x7564,
1390
+ 0xF775 => 0x7756,
1391
+ 0xF6BD => 0x763F,
1392
+ 0xF674 => 0x7555,
1393
+ 0xF79C => 0x777C,
1394
+ 0xF7AD => 0x782F,
1395
+ 0xF79D => 0x777D,
1396
+ 0xF7B3 => 0x7835,
1397
+ 0xF6D7 => 0x7659,
1398
+ 0xF6D6 => 0x7658,
1399
+ 0xF778 => 0x7759,
1400
+ 0xF799 => 0x7779,
1401
+ 0xF779 => 0x775A,
1402
+ 0xF776 => 0x7757,
1403
+ 0xF6F1 => 0x7673,
1404
+ 0xF777 => 0x7758,
1405
+ 0xF6F2 => 0x7674,
1406
+ 0xF790 => 0x7770,
1407
+ 0xF788 => 0x7768,
1408
+ 0xF675 => 0x7556,
1409
+ 0xF677 => 0x7558,
1410
+ 0xF781 => 0x7761,
1411
+ 0xF79E => 0x777E,
1412
+ 0xF7B4 => 0x7836,
1413
+ 0xF6F3 => 0x7675,
1414
+ 0xF68A => 0x756A,
1415
+ 0xF686 => 0x7566,
1416
+ 0xF79F => 0x7821,
1417
+ 0xF78D => 0x776D,
1418
+ 0xF791 => 0x7771,
1419
+ 0xF67A => 0x755B,
1420
+ 0xF792 => 0x7772,
1421
+ 0xF793 => 0x7773,
1422
+ 0xF6F4 => 0x7676,
1423
+ 0xF69D => 0x757D,
1424
+ 0xF7A0 => 0x7822,
1425
+ 0xF7A5 => 0x7827,
1426
+ 0xF789 => 0x7769,
1427
+ 0xF7A6 => 0x7828,
1428
+ 0xF77A => 0x775B,
1429
+ 0xF6DA => 0x765C,
1430
+ 0xF6A7 => 0x7629,
1431
+ 0xF7A7 => 0x7829,
1432
+ 0xF6BA => 0x763C,
1433
+ 0xF6F8 => 0x767A,
1434
+ 0xF7A1 => 0x7823,
1435
+ 0xF6F9 => 0x767B,
1436
+ 0xF77B => 0x775C,
1437
+ 0xF666 => 0x7547,
1438
+ 0xF78A => 0x776A,
1439
+ 0xF68C => 0x756C,
1440
+ 0xF6F5 => 0x7677,
1441
+ 0xF68D => 0x756D,
1442
+ 0xF7A2 => 0x7824,
1443
+ 0xF6A1 => 0x7623,
1444
+ 0xF6D8 => 0x765A,
1445
+ 0xF7A8 => 0x782A,
1446
+ 0xF6D9 => 0x765B,
1447
+ 0xF68E => 0x756E,
1448
+ 0xF78B => 0x776B,
1449
+ 0xF7A9 => 0x782B,
1450
+ 0xF678 => 0x7559,
1451
+ 0xF7AA => 0x782C,
1452
+ 0xF6A8 => 0x762A,
1453
+ 0xF7AB => 0x782D,
1454
+ 0xF6F6 => 0x7678,
1455
+ 0xF655 => 0x7536,
1456
+ 0xF685 => 0x7565,
1457
+ 0xF656 => 0x7537,
1458
+ 0xF78C => 0x776C,
1459
+ 0xF657 => 0x7538,
1460
+ 0xF68B => 0x756B,
1461
+ 0xF658 => 0x7539,
1462
+ 0xF679 => 0x755A,
1463
+ 0xF6FB => 0x767D,
1464
+ 0xF7A3 => 0x7825,
1465
+ 0xF6FC => 0x767E,
1466
+ 0xF7AE => 0x7830,
1467
+ 0xF740 => 0x7721,
1468
+ 0xF7A4 => 0x7826,
1469
+ 0xF741 => 0x7722,
1470
+ 0xF7AF => 0x7831,
1471
+ 0xF742 => 0x7723,
1472
+ 0xF7B0 => 0x7832,
1473
+ 0xF743 => 0x7724,
1474
+ 0xF6F7 => 0x7679,
1475
+ 0xF744 => 0x7725,
1476
+ 0xF745 => 0x7726,
1477
+ 0xF643 => 0x7524,
1478
+ 0xF746 => 0x7727,
1479
+ 0xF68F => 0x756F,
1480
+ 0xF747 => 0x7728,
1481
+ 0xF690 => 0x7570,
1482
+ 0xF641 => 0x7522,
1483
+ 0xF691 => 0x7571,
1484
+ 0xF65D => 0x753E,
1485
+ 0xF692 => 0x7572,
1486
+ 0xF667 => 0x7548,
1487
+ 0xF645 => 0x7526,
1488
+ 0xF668 => 0x7549,
1489
+ 0xF695 => 0x7575,
1490
+ 0xF669 => 0x754A,
1491
+ 0xF696 => 0x7576,
1492
+ 0xF66A => 0x754B,
1493
+ 0xF697 => 0x7577,
1494
+ 0xF66B => 0x754C,
1495
+ 0xF698 => 0x7578,
1496
+ 0xF66C => 0x754D,
1497
+ 0xF699 => 0x7579,
1498
+ 0xF66D => 0x754E,
1499
+ 0xF646 => 0x7527,
1500
+ 0xF66E => 0x754F,
1501
+ 0xF647 => 0x7528,
1502
+ 0xF66F => 0x7550,
1503
+ 0xF69E => 0x757E,
1504
+ 0xF670 => 0x7551,
1505
+ 0xF69F => 0x7621,
1506
+ 0xF671 => 0x7552,
1507
+ 0xF6A0 => 0x7622,
1508
+ 0xF672 => 0x7553,
1509
+ 0xF6A2 => 0x7624,
1510
+ 0xF673 => 0x7554,
1511
+ 0xF6A3 => 0x7625,
1512
+ 0xF67B => 0x755C,
1513
+ 0xF6A4 => 0x7626,
1514
+ 0xF67C => 0x755D,
1515
+ 0xF6A5 => 0x7627,
1516
+ 0xF67D => 0x755E,
1517
+ 0xF6A6 => 0x7628,
1518
+ 0xF67E => 0x755F,
1519
+ 0xF6A9 => 0x762B,
1520
+ 0xF680 => 0x7560,
1521
+ 0xF6AA => 0x762C,
1522
+ 0xF681 => 0x7561,
1523
+ 0xF6AB => 0x762D,
1524
+ 0xF682 => 0x7562,
1525
+ 0xF6AC => 0x762E,
1526
+ 0xF683 => 0x7563,
1527
+ 0xF6AD => 0x762F,
1528
+ 0xF78E => 0x776E,
1529
+ 0xF6AE => 0x7630,
1530
+ 0xF78F => 0x776F,
1531
+ 0xF6AF => 0x7631,
1532
+ 0xF687 => 0x7567,
1533
+ 0xF648 => 0x7529,
1534
+ 0xF688 => 0x7568,
1535
+ 0xF6B0 => 0x7632,
1536
+ 0xF689 => 0x7569,
1537
+ 0xF6B1 => 0x7633,
1538
+ 0xF6B2 => 0x7634,
1539
+ 0xF6CB => 0x764D,
1540
+ 0xF6B3 => 0x7635,
1541
+ 0xF6CC => 0x764E,
1542
+ 0xF6B4 => 0x7636,
1543
+ 0xF6CD => 0x764F,
1544
+ 0xF6B5 => 0x7637,
1545
+ 0xF6CE => 0x7650,
1546
+ 0xF6B6 => 0x7638,
1547
+ 0xF6CF => 0x7651,
1548
+ 0xF6B7 => 0x7639,
1549
+ 0xF6D0 => 0x7652,
1550
+ 0xF6BB => 0x763D,
1551
+ 0xF6D1 => 0x7653,
1552
+ 0xF6BC => 0x763E,
1553
+ 0xF6D2 => 0x7654,
1554
+ 0xF649 => 0x752A,
1555
+ 0xF6DB => 0x765D,
1556
+ 0xF64A => 0x752B,
1557
+ 0xF6DC => 0x765E,
1558
+ 0xF64B => 0x752C,
1559
+ 0xF6DD => 0x765F,
1560
+ 0xF64C => 0x752D,
1561
+ 0xF6DE => 0x7660,
1562
+ 0xF64D => 0x752E,
1563
+ 0xF6DF => 0x7661,
1564
+ 0xF6BE => 0x7640,
1565
+ 0xF6E0 => 0x7662,
1566
+ 0xF6BF => 0x7641,
1567
+ 0xF6E1 => 0x7663,
1568
+ 0xF6C0 => 0x7642,
1569
+ 0xF6E2 => 0x7664,
1570
+ 0xF64F => 0x7530,
1571
+ 0xF6E3 => 0x7665,
1572
+ 0xF650 => 0x7531,
1573
+ 0xF6E4 => 0x7666,
1574
+ 0xF651 => 0x7532,
1575
+ 0xF794 => 0x7774,
1576
+ 0xF652 => 0x7533,
1577
+ 0xF795 => 0x7775,
1578
+ 0xF653 => 0x7534,
1579
+ 0xF6E5 => 0x7667,
1580
+ 0xF6C1 => 0x7643,
1581
+ 0xF6E6 => 0x7668,
1582
+ 0xF6C2 => 0x7644,
1583
+ 0xF6E7 => 0x7669,
1584
+ 0xF6C3 => 0x7645,
1585
+ 0xF6E8 => 0x766A,
1586
+ 0xF6C4 => 0x7646,
1587
+ 0xF6E9 => 0x766B,
1588
+ 0xF6C5 => 0x7647,
1589
+ 0xF7B5 => 0x7837,
1590
+ 0xF6C6 => 0x7648,
1591
+ 0xF7B6 => 0x7838,
1592
+ 0xF6C7 => 0x7649,
1593
+ 0xF7B7 => 0x7839,
1594
+ 0xF6C8 => 0x764A,
1595
+ 0xF7B8 => 0x783A,
1596
+ 0xF6C9 => 0x764B,
1597
+ 0xF7B9 => 0x783B,
1598
+ 0xF6CA => 0x764C,
1599
+ 0xF7BA => 0x783C,
1600
+ 0xF7BB => 0x783D,
1601
+ 0xF7ED => 0x786F,
1602
+ 0xF7BC => 0x783E,
1603
+ 0xF7EE => 0x7870,
1604
+ 0xF7BD => 0x783F,
1605
+ 0xF7EF => 0x7871,
1606
+ 0xF7BE => 0x7840,
1607
+ 0xF7F0 => 0x7872,
1608
+ 0xF7BF => 0x7841,
1609
+ 0xF7F1 => 0x7873,
1610
+ 0xF7C0 => 0x7842,
1611
+ 0xF7F2 => 0x7874,
1612
+ 0xF7C1 => 0x7843,
1613
+ 0xF7F3 => 0x7875,
1614
+ 0xF7C2 => 0x7844,
1615
+ 0xF7F4 => 0x7876,
1616
+ 0xF7C3 => 0x7845,
1617
+ 0xF7F5 => 0x7877,
1618
+ 0xF7C4 => 0x7846,
1619
+ 0xF7F6 => 0x7878,
1620
+ 0xF7C5 => 0x7847,
1621
+ 0xF7F7 => 0x7879,
1622
+ 0xF7C6 => 0x7848,
1623
+ 0xF7F8 => 0x787A,
1624
+ 0xF7C7 => 0x7849,
1625
+ 0xF7F9 => 0x787B,
1626
+ 0xF7C8 => 0x784A,
1627
+ 0xF7FA => 0x787C,
1628
+ 0xF7C9 => 0x784B,
1629
+ 0xF7FB => 0x787D,
1630
+ 0xF7CA => 0x784C,
1631
+ 0xF7FC => 0x787E,
1632
+ 0xF7CB => 0x784D,
1633
+ 0xF340 => 0x7921,
1634
+ 0xF7CC => 0x784E,
1635
+ 0xF341 => 0x7922,
1636
+ 0xF7CD => 0x784F,
1637
+ 0xF342 => 0x7923,
1638
+ 0xF7CE => 0x7850,
1639
+ 0xF343 => 0x7924,
1640
+ 0xF7CF => 0x7851,
1641
+ 0xF344 => 0x7925,
1642
+ 0xF7D0 => 0x7852,
1643
+ 0xF345 => 0x7926,
1644
+ 0xF7D1 => 0x7853,
1645
+ 0xF346 => 0x7927,
1646
+ 0xF7E5 => 0x7867,
1647
+ 0xF347 => 0x7928,
1648
+ 0xF7E6 => 0x7868,
1649
+ 0xF348 => 0x7929,
1650
+ 0xF7E7 => 0x7869,
1651
+ 0xF349 => 0x792A,
1652
+ 0xF7E8 => 0x786A,
1653
+ 0xF34A => 0x792B,
1654
+ 0xF7E9 => 0x786B,
1655
+ 0xF34B => 0x792C,
1656
+ 0xF7EA => 0x786C,
1657
+ 0xF34C => 0x792D,
1658
+ 0xF7EB => 0x786D,
1659
+ 0xF34D => 0x792E,
1660
+ 0xF7EC => 0x786E,
1661
+ 0xF34E => 0x792F,
1662
+ 0xF34F => 0x7930,
1663
+ 0xF36E => 0x794F,
1664
+ 0xF350 => 0x7931,
1665
+ 0xF36F => 0x7950,
1666
+ 0xF351 => 0x7932,
1667
+ 0xF370 => 0x7951,
1668
+ 0xF352 => 0x7933,
1669
+ 0xF371 => 0x7952,
1670
+ 0xF353 => 0x7934,
1671
+ 0xF372 => 0x7953,
1672
+ 0xF354 => 0x7935,
1673
+ 0xF373 => 0x7954,
1674
+ 0xF355 => 0x7936,
1675
+ 0xF374 => 0x7955,
1676
+ 0xF356 => 0x7937,
1677
+ 0xF375 => 0x7956,
1678
+ 0xF357 => 0x7938,
1679
+ 0xF376 => 0x7957,
1680
+ 0xF358 => 0x7939,
1681
+ 0xF377 => 0x7958,
1682
+ 0xF359 => 0x793A,
1683
+ 0xF378 => 0x7959,
1684
+ 0xF35A => 0x793B,
1685
+ 0xF379 => 0x795A,
1686
+ 0xF35B => 0x793C,
1687
+ 0xF37A => 0x795B,
1688
+ 0xF35C => 0x793D,
1689
+ 0xF37B => 0x795C,
1690
+ 0xF35D => 0x793E,
1691
+ 0xF37C => 0x795D,
1692
+ 0xF35E => 0x793F,
1693
+ 0xF37D => 0x795E,
1694
+ 0xF35F => 0x7940,
1695
+ 0xF37E => 0x795F,
1696
+ 0xF360 => 0x7941,
1697
+ 0xF380 => 0x7960,
1698
+ 0xF361 => 0x7942,
1699
+ 0xF381 => 0x7961,
1700
+ 0xF362 => 0x7943,
1701
+ 0xF382 => 0x7962,
1702
+ 0xF363 => 0x7944,
1703
+ 0xF383 => 0x7963,
1704
+ 0xF364 => 0x7945,
1705
+ 0xF384 => 0x7964,
1706
+ 0xF365 => 0x7946,
1707
+ 0xF385 => 0x7965,
1708
+ 0xF366 => 0x7947,
1709
+ 0xF386 => 0x7966,
1710
+ 0xF367 => 0x7948,
1711
+ 0xF387 => 0x7967,
1712
+ 0xF368 => 0x7949,
1713
+ 0xF388 => 0x7968,
1714
+ 0xF369 => 0x794A,
1715
+ 0xF389 => 0x7969,
1716
+ 0xF36A => 0x794B,
1717
+ 0xF38A => 0x796A,
1718
+ 0xF36B => 0x794C,
1719
+ 0xF38B => 0x796B,
1720
+ 0xF36C => 0x794D,
1721
+ 0xF38C => 0x796C,
1722
+ 0xF36D => 0x794E,
1723
+ 0xF38D => 0x796D,
1724
+ 0xF38E => 0x796E,
1725
+ 0xF3AD => 0x7A2F,
1726
+ 0xF38F => 0x796F,
1727
+ 0xF3AE => 0x7A30,
1728
+ 0xF390 => 0x7970,
1729
+ 0xF3AF => 0x7A31,
1730
+ 0xF391 => 0x7971,
1731
+ 0xF3B0 => 0x7A32,
1732
+ 0xF392 => 0x7972,
1733
+ 0xF3B1 => 0x7A33,
1734
+ 0xF393 => 0x7973,
1735
+ 0xF3B2 => 0x7A34,
1736
+ 0xF394 => 0x7974,
1737
+ 0xF3B3 => 0x7A35,
1738
+ 0xF395 => 0x7975,
1739
+ 0xF3B4 => 0x7A36,
1740
+ 0xF396 => 0x7976,
1741
+ 0xF3B5 => 0x7A37,
1742
+ 0xF397 => 0x7977,
1743
+ 0xF3B6 => 0x7A38,
1744
+ 0xF398 => 0x7978,
1745
+ 0xF3B7 => 0x7A39,
1746
+ 0xF399 => 0x7979,
1747
+ 0xF3B8 => 0x7A3A,
1748
+ 0xF39A => 0x797A,
1749
+ 0xF3B9 => 0x7A3B,
1750
+ 0xF39B => 0x797B,
1751
+ 0xF3BA => 0x7A3C,
1752
+ 0xF39C => 0x797C,
1753
+ 0xF3BB => 0x7A3D,
1754
+ 0xF39D => 0x797D,
1755
+ 0xF3BC => 0x7A3E,
1756
+ 0xF39E => 0x797E,
1757
+ 0xF3BD => 0x7A3F,
1758
+ 0xF39F => 0x7A21,
1759
+ 0xF3BE => 0x7A40,
1760
+ 0xF3A0 => 0x7A22,
1761
+ 0xF3BF => 0x7A41,
1762
+ 0xF3A1 => 0x7A23,
1763
+ 0xF3C0 => 0x7A42,
1764
+ 0xF3A2 => 0x7A24,
1765
+ 0xF3C1 => 0x7A43,
1766
+ 0xF3A3 => 0x7A25,
1767
+ 0xF3C2 => 0x7A44,
1768
+ 0xF3A4 => 0x7A26,
1769
+ 0xF3C3 => 0x7A45,
1770
+ 0xF3A5 => 0x7A27,
1771
+ 0xF3C4 => 0x7A46,
1772
+ 0xF3A6 => 0x7A28,
1773
+ 0xF3C5 => 0x7A47,
1774
+ 0xF3A7 => 0x7A29,
1775
+ 0xF3C6 => 0x7A48,
1776
+ 0xF3A8 => 0x7A2A,
1777
+ 0xF3C7 => 0x7A49,
1778
+ 0xF3A9 => 0x7A2B,
1779
+ 0xF3C8 => 0x7A4A,
1780
+ 0xF3AA => 0x7A2C,
1781
+ 0xF3C9 => 0x7A4B,
1782
+ 0xF3AB => 0x7A2D,
1783
+ 0xF3CA => 0x7A4C,
1784
+ 0xF3AC => 0x7A2E,
1785
+ 0xF3CB => 0x7A4D,
1786
+ 0xF3CC => 0x7A4E,
1787
+ 0xF3D8 => 0x7A5A,
1788
+ 0xF3CD => 0x7A4F,
1789
+ 0xF3D9 => 0x7A5B,
1790
+ 0xF3CE => 0x7A50,
1791
+ 0xF3DA => 0x7A5C,
1792
+ 0xF7D2 => 0x7854,
1793
+ 0xF3DB => 0x7A5D,
1794
+ 0xF7D3 => 0x7855,
1795
+ 0xF3DC => 0x7A5E,
1796
+ 0xF7D4 => 0x7856,
1797
+ 0xF3DD => 0x7A5F,
1798
+ 0xF7D5 => 0x7857,
1799
+ 0xF3DE => 0x7A60,
1800
+ 0xF7D6 => 0x7858,
1801
+ 0xF3DF => 0x7A61,
1802
+ 0xF7D7 => 0x7859,
1803
+ 0xF3E0 => 0x7A62,
1804
+ 0xF7D8 => 0x785A,
1805
+ 0xF3E1 => 0x7A63,
1806
+ 0xF7D9 => 0x785B,
1807
+ 0xF3E2 => 0x7A64,
1808
+ 0xF7DA => 0x785C,
1809
+ 0xF3E3 => 0x7A65,
1810
+ 0xF7DB => 0x785D,
1811
+ 0xF3E4 => 0x7A66,
1812
+ 0xF7DC => 0x785E,
1813
+ 0xF3E5 => 0x7A67,
1814
+ 0xF7DD => 0x785F,
1815
+ 0xF3E6 => 0x7A68,
1816
+ 0xF7DE => 0x7860,
1817
+ 0xF3E7 => 0x7A69,
1818
+ 0xF7DF => 0x7861,
1819
+ 0xF3E8 => 0x7A6A,
1820
+ 0xF7E0 => 0x7862,
1821
+ 0xF3E9 => 0x7A6B,
1822
+ 0xF7E1 => 0x7863,
1823
+ 0xF3EA => 0x7A6C,
1824
+ 0xF7E2 => 0x7864,
1825
+ 0xF3EB => 0x7A6D,
1826
+ 0xF7E3 => 0x7865,
1827
+ 0xF3EC => 0x7A6E,
1828
+ 0xF7E4 => 0x7866,
1829
+ 0xF3ED => 0x7A6F,
1830
+ 0xF3CF => 0x7A51,
1831
+ 0xF3EE => 0x7A70,
1832
+ 0xF3D0 => 0x7A52,
1833
+ 0xF3EF => 0x7A71,
1834
+ 0xF3D1 => 0x7A53,
1835
+ 0xF3F0 => 0x7A72,
1836
+ 0xF3D2 => 0x7A54,
1837
+ 0xF3F1 => 0x7A73,
1838
+ 0xF3D3 => 0x7A55,
1839
+ 0xF3F2 => 0x7A74,
1840
+ 0xF3D4 => 0x7A56,
1841
+ 0xF3F3 => 0x7A75,
1842
+ 0xF3D5 => 0x7A57,
1843
+ 0xF3F4 => 0x7A76,
1844
+ 0xF3D6 => 0x7A58,
1845
+ 0xF3F5 => 0x7A77,
1846
+ 0xF3D7 => 0x7A59,
1847
+ 0xF3F6 => 0x7A78,
1848
+ 0xF3F7 => 0x7A79,
1849
+ 0xF459 => 0x7B3A,
1850
+ 0xF3F8 => 0x7A7A,
1851
+ 0xF45A => 0x7B3B,
1852
+ 0xF3F9 => 0x7A7B,
1853
+ 0xF45B => 0x7B3C,
1854
+ 0xF3FA => 0x7A7C,
1855
+ 0xF45C => 0x7B3D,
1856
+ 0xF3FB => 0x7A7D,
1857
+ 0xF45D => 0x7B3E,
1858
+ 0xF3FC => 0x7A7E,
1859
+ 0xF45E => 0x7B3F,
1860
+ 0xF440 => 0x7B21,
1861
+ 0xF45F => 0x7B40,
1862
+ 0xF441 => 0x7B22,
1863
+ 0xF460 => 0x7B41,
1864
+ 0xF442 => 0x7B23,
1865
+ 0xF461 => 0x7B42,
1866
+ 0xF443 => 0x7B24,
1867
+ 0xF462 => 0x7B43,
1868
+ 0xF444 => 0x7B25,
1869
+ 0xF463 => 0x7B44,
1870
+ 0xF445 => 0x7B26,
1871
+ 0xF464 => 0x7B45,
1872
+ 0xF446 => 0x7B27,
1873
+ 0xF465 => 0x7B46,
1874
+ 0xF447 => 0x7B28,
1875
+ 0xF466 => 0x7B47,
1876
+ 0xF448 => 0x7B29,
1877
+ 0xF467 => 0x7B48,
1878
+ 0xF449 => 0x7B2A,
1879
+ 0xF468 => 0x7B49,
1880
+ 0xF44A => 0x7B2B,
1881
+ 0xF469 => 0x7B4A,
1882
+ 0xF44B => 0x7B2C,
1883
+ 0xF46A => 0x7B4B,
1884
+ 0xF44C => 0x7B2D,
1885
+ 0xF46B => 0x7B4C,
1886
+ 0xF44D => 0x7B2E,
1887
+ 0xF46C => 0x7B4D,
1888
+ 0xF44E => 0x7B2F,
1889
+ 0xF46D => 0x7B4E,
1890
+ 0xF44F => 0x7B30,
1891
+ 0xF46E => 0x7B4F,
1892
+ 0xF450 => 0x7B31,
1893
+ 0xF46F => 0x7B50,
1894
+ 0xF451 => 0x7B32,
1895
+ 0xF470 => 0x7B51,
1896
+ 0xF452 => 0x7B33,
1897
+ 0xF471 => 0x7B52,
1898
+ 0xF453 => 0x7B34,
1899
+ 0xF472 => 0x7B53,
1900
+ 0xF454 => 0x7B35,
1901
+ 0xF473 => 0x7B54,
1902
+ 0xF455 => 0x7B36,
1903
+ 0xF474 => 0x7B55,
1904
+ 0xF456 => 0x7B37,
1905
+ 0xF475 => 0x7B56,
1906
+ 0xF457 => 0x7B38,
1907
+ 0xF476 => 0x7B57,
1908
+ 0xF458 => 0x7B39,
1909
+ 0xF477 => 0x7B58,
1910
+ 0xF478 => 0x7B59,
1911
+ 0xF479 => 0x7B5A,
1912
+ 0xF47A => 0x7B5B,
1913
+ 0xF47B => 0x7B5C,
1914
+ 0xF47C => 0x7B5D,
1915
+ 0xF47D => 0x7B5E,
1916
+ 0xF47E => 0x7B5F,
1917
+ 0xF480 => 0x7B60,
1918
+ 0xF481 => 0x7B61,
1919
+ 0xF482 => 0x7B62,
1920
+ 0xF483 => 0x7B63,
1921
+ 0xF484 => 0x7B64,
1922
+ 0xF485 => 0x7B65,
1923
+ 0xF486 => 0x7B66,
1924
+ 0xF487 => 0x7B67,
1925
+ 0xF488 => 0x7B68,
1926
+ 0xF489 => 0x7B69,
1927
+ 0xF48A => 0x7B6A,
1928
+ 0xF48B => 0x7B6B,
1929
+ 0xF48C => 0x7B6C,
1930
+ 0xF48D => 0x7B6D
1931
+ }